今天第一次到IT博客网写文章,确切地说应该是转文章,哈哈。 之前也看到IT博客网里面有位运算符巧妙应用的文章,可是后来又看到了一篇英文文章里也写了,干脆转过来吧,哈哈。
转自:http://www.codeproject.com/KB/cpp/Bitwise_Operation.aspx
1,交换两个变量的值,不许使用第三个变量。
void __SWAP(int *a, int *b){
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
a = 5
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
1
|
b = 6
|
0
|
0
|
0
|
0
|
0
|
1
|
1
|
0
|
第一次异或处理之后:
a
|
0
|
0
|
0
|
0
|
0
|
0 (*)
|
1 (*)
|
1
|
b
|
0
|
0
|
0
|
0
|
0
|
1
|
1
|
0
|
第二次异或处理之后:
a
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
1
|
b
|
0
|
0
|
0
|
0
|
0
|
1
|
0 (*)
|
1 (*)
|
第三次异或处理之后:数值已经互换过来了。
a
|
0
|
0
|
0
|
0
|
0
|
1 (*)
|
1
|
0 (*)
|
b
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
1
|
2,判断一个数是否为2的整数次幂。
法一:(((a)&(a-1))==0)?1:0
Number
|
128
|
64
|
32
|
16
|
8
|
4
|
2
|
1
|
128
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
128-1=127
|
0
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
128 bitwise-AND 127
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
法二:(((a)&(-a))==a)?1:0
Number
|
128
|
64
|
32
|
16
|
8
|
4
|
2
|
1
|
4
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
-4(补码)
|
1
|
1
|
1
|
1
|
1
|
1
|
0
|
0
|
4&(-4)
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|