当前位置:主页   - 电脑 - 程序设计 - C/C++
C:位运算
来源:网络   作者:   更新时间:2012-02-08
收藏此页】    【字号    】    【打印】    【关闭

  1.负数表示-二类补数(twos complement)

  一般使用二类补数表示负数,最左边一位为符号位.

  将一个十进制负数转化为二进制符号数时,首先给这个数加1,然后取绝对值,再将其转换为二进制,最后对这个二进制求补.

  [1]-5

  [2]-4

  [3]4

  [4]0000 0100

  [5]1111 1011

  将一个负数从二进制转换为十进制,首先对其所有位求补,然后将结果转换为十进制,再改变其符号,最后再减1.

  [1]1111 1011

  [2]0000 0100

  [3]4

  [4]-4

  [5]-5

  使用二类补数表示数字时,用n位可存储的最大正数是2n-1-1,用n位可存储的最小负数-2n-1.

  假设整数占32位(4字节),此时可存储的最大正数231-1,最小负数-231,而如果是无符号整数,即unsigned int,其表示范围为0至232-1.

  2.按位与和按位或

  按位与经常用于屏蔽一个数中的某些位,

  word &= 0x1//除最右边4位外,其余位清零

  按位或经常用于将某些位设定为1

  word |= 0x1//将最右边4位设定为1

  3.异或运算

  异或运算可以交换两个值而不需要使用临时变量.

/*exchange two integer values*/
void swap(int * a, int * b)
{
  *a ^= *b;
  *b ^= *a;
  *a ^= *b;
}

  如果某数与1进行异或运算,可以达到取反的效果,0^1=1,1^1=0.

  这里假设机器的整型数长度为32位,对整数0的31位取反,得到最大整数.

int main()
{
  int a=0;
  printf("%i,%i",a,a ^ 0x7fffffff);
  return 0;
}

  4.几个经典的位运算函数

  4.1求当前机器无符号整型最大长度

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明