参考博文 : http://blog.csdn.net/morewindows/article/details/7354571
输入一个数字,然后计算出它二进制中'1'的个数。此方法相对于使用自带的String库,把空间节约到了O(1)。
static int bitCount(int n) { int count = 0; while (n != 0) { count += (n & 1); n >>= 1; } return count; }
获取x中0到16位的低位值
x = x & 0xffff;
获取16~32位的值
x = (x >> 16 ) & 0xffff;
求相反数 // 取反+1
i = (i ^ -1) + 1;
求绝对值
证明 :
先移位来取符号位,int i = a >> 31;要注意如果a为正数,i等于0,为负数,i等于-1。然后对i进行判断——如果i等于0,直接返回。否之,返回~a+1。
//by MoreWindows( http://blog.csdn.net/MoreWindows ) int my_abs(int a) { int i = a >> 31; return i == 0 ? a : (~a + 1); }
或者 因为 x >>31 只可能我0或-1 可能你会觉得-1右移31不会是1吗,怎么变成了-1了,因为负数右移的时候,左边填充的不是0而是1!!
1. 与0相异或,不变 如果x是正数的话,不变
2. 与-1(oxffff) 相异或,相当于取反,以为为1的地方变成了0,为0的地方变成了1 ,然后+1
i = (x ^ (x >> 31)) - (x >> 31);
交换
void swap(int a,int b){ a = a^b; b = a^b; a = a^b; }
证明:
第一步 a^=b 即a=(a^b);
第二步 b^=a 即b=b^(a^b),由于^运算满足交换律,b^(a^b)=b^b^a。由于一个数和自己异或的结果为0并且任何数与0异或都会不变的,所以此时b被赋上了a的值。
第三步 a^=b 就是a=a^b,由于前面二步可知a=(a^b),b=a,所以a=a^b即a=(a^b)^a。故a会被赋上b的值。