(3) 将int型变量a的第k位清0,即a=a&~(1<<k) (10000 取反后为00001 )
(4) 将int型变量a的第k位置1,即a=a|(1<<k)
(5)
int型变量循环左移k次,即a=a<<k|a>>16-k (设sizeof(int)=16)
(6)
int型变量a循环右移k次,即a=a>>k|a<<16-k (设sizeof(int)=16)
(7)对于一个数 x >= 0,判断是不是2的幂。
boolean power2(int x)
{
return (
(x&(x-1))==0) && (x!=0);
}
(9)计算绝对值
int abs( int x )
{
int y ;
y = x >> 31
;
return (x^y)-y
; //or:
(x+y)^y
}
x=
b;
else x=
a;
等价于 x= a ^ b ^
x;
(15) x 的 相反数 表示为 (~x+1)
(16)输入2的n次方:1 <<
19
(17)乘除2的倍数:千万不要用乘除法,非常拖效率。只要知道左移1位就是乘以2,右移1位就是除以2就行了。比如要算25 *
4,用25 << 2就好啦
实例
功能 | 示例 | 位运算
----------------------+---------------------------+--------------------
去掉最后一位 |
(101101->10110) |
x >>
1
在最后加一个0 |
(101101->1011010) |
x < <
1
在最后加一个1 |
(101101->1011011) |
x < <
1+1
把最后一位变成1 |
(101100->101101) |
x | 1
把最后一位变成0 |
(101101->101100) |
x |
1-1
最后一位取反 |
(101101->101100) |
x ^ 1
把右数第k位变成1 |
(101001->101101,k=3) | x | (1
< <
(k-1))
把右数第k位变成0 |
(101101->101001,k=3) | x &
~ (1 < <
(k-1))
右数第k位取反 |
(101001->101101,k=3) | x ^ (1
< <
(k-1))
取末三位 |
(1101101->101) |
x &
7
取末k位 |
(1101101->1101,k=5) | x &
((1 < <
k)-1)
取右数第k位 |
(1101101->1,k=4) |
x >> (k-1) &
1
把末k位变成1 |
(101001->101111,k=4) | x | (1
< <
k-1)
末k位取反 |
(101001->100110,k=4) | x ^ (1
< < k-1)
把右边连续的1变成0 |
(100101111->100100000) | x &
(x+1)
把右起第一个0变成1 |
(100101111->100111111) | x |
(x+1)
把右边连续的0变成1 |
(11011000->11011111) | x |
(x-1)
取右边连续的1 |
(100101111->1111) |
(x ^ (x+1)) >> 1
去掉右起第一个1的左边 |
(100101000->1000) |
x & (x ^ (x-1))
判断奇数
(x&1)==1
判断偶数 (x&1)==0
原文:http://www.cnblogs.com/zn505119020/p/3645236.html