本篇旨在记录”奇思妙想”的位运算。
1的个数
int c = 10;
int count = (c == 0 ? 0 : 1) ;
while( c = c&(c-1) ){
count++;
}
解析
c-1 会导致c最末尾的1 因为借位变为0,而此前最末尾的1后面必然全是0(或者1为个位),所以当c&(c-1)时,就相当于消去c中最末尾的一个1。 如6的二进制是0110,6-1的二进制是0101。
0的个数
int c = 10;
int count = 0 ;
while( c+1 ){
count++;
c = c | (c+1);
}
解析
x|(x+1)的作用是对一个数中二进制0的个数进行统计.
求余
用位运算求a%b,要求b是2的n次幂,即b必须是1,2,4,8…等等类型的数才可以。
c & (8- 1); //等价于c % 8, 另外8 = 1<<3;
判断奇偶性
奇数二进制最后一位为1 。
(i & 1) == 0 ; //成立表示是偶数
swap功能
交换a和b的值,而不借助第三方变量。
a ^= b;
b ^= a;
a ^= b;
相反数
a = a * (-1);
~a + 1
330

被折叠的 条评论
为什么被折叠?



