1.判断奇偶
if ((a & 1) == 0)判断a是否是偶数,同理if ((a & 1) == 0)判断a是否是奇数。2.交换两数
不用第三个变量交换两个数,如下:void Swap(int &a, int &b)
{
if (a != b)
{
a ^= b;
b ^= a;
a ^= b;
}
}
3.变换整形数符号
正数变成负数,负数变成正数。计算机中的数是用二进制补码形式表示的,正数和负数的相互变换可以“取反加1”,所以代码如下:int SignReversal(int a)
{
return ~a + 1;
}
4.求绝对值
int my_abs(int a){
int i = a >> 31;
return ((a ^ i) - i);
}
首先有规则:任意整形数与0异或将不变,与-1(0xFFFFFFFF)异或将取反。
a>=0时,a>>31结果为0,即i=0,(a^i)-i即(a^0)-0得到a,即a的绝对值是a本身;
a<0时,a>>31结果为-1(0xFFFFFFFF),(a^i)-i即(a^(-1))-(-1)得到a取反加1,即-a。
5.求无符号数的二进制中1的个数
以前看到过这个笔试题,觉得挺巧妙的,解法大概如下:int CountOne(unsigned int a)
{
int n = 0;
while (a & (a-1) )
{
++n;
a &= (a-1);
}
return n;
}
参考资料:http://blog.youkuaiyun.com/morewindows/article/details/7354571