Welcome

首页 / 软件开发 / C语言 / C:位运算

C:位运算2010-06-17“子 孑” 博客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;
}