C语言提供了六种位运算符:
& 按位与
|按位或
^按位异或
〜否定
> 右移,正数高位补0,负数由计算机决定
向左循环k次(x(32-k)),
向右循环 k 次 (x>>k) | (x 括号成员优先;//括号运算符[]()成员运算符。->
所有一元二度; //++、--、+(正)、-(负)等所有一元运算符,指针运算*、&乘除余数三,加减四; //这个“余数”指的是求余运算,即%
轮班五,关系六; //移位运算符:>,关系:> < >= >2
表示右移至(十进制 3)。
注意:对于有符号数,右移时,符号位也随之移动。 当为正数时,最高位填充0,当为负数时,符号位为1。
最高位补0还是1取决于编译系统的要求。 Turbo C 和许多系统指定补数为 1。
使用简单
1:交换两个数字(字符)。 您可以交换两个变量的值而不使用第三个变量:
使用异或^,原理:两次异或即可还原,即a = (a^b) ^ b
二:判断一个数是否是2的幂:
原理:2的幂的二进制表示中只有一位是1,其他位都是0
x = x&(x-1) 将x的二进制码最右边的1设置为0。如果结果为0,则说明x原本只有一位为1,其他位均为0。
bool (int x) { (x&(x-1)==0 && (x!=0)); }
bool (int x) { ( (x&-x)==x ); }
三:求一个整数有多少位为0:
原理与上面相同。 使用 x&(x-1)
=0;(x)3{4++计数;5x &= (x-1);6}
四:快速二进制求幂:
(intx, n){ =1; (n){4if(n &1) p *= x;5x *= x;6n >>=1;7 } p;9}
五:判断奇偶数:
原理:奇数最后一位为1,偶数最后一位为0
布尔奇数(int x) { x&1; }
bool 偶数(int x) { !(x&1); }
n%2 = n&1
n%4 = n&3
n%8 = n&7
……
六:求x的绝对值:
原理:x为正数时不改变; 当x为负数时,将其取反并加1。
当x为正数时,y = 0 = 0 0000
当x为负数时,y = -1 = 1 1111
与 0 异或为自身,与 1 异或为求反
(int x){2inty = x >>31;(x^yy);4}
七:对 2 的幂取模:
原理:x&y取出x和y的二进制1的所有位。 x^y>>1 取出只有一个二进制位1的x,y并除以2
(x&y) + (x^y)>>1);
请注意,当不使用位运算时,(x+y)/2 可能会导致溢出。
x 向上舍入为 y,其中 y=2^n(用于字节对齐):
# rund(x,y) ( ((x)+(y)-1)&~((y)-1) )
八:其他:
只有一个数 1 k &1 第 k 位为 1
x的第k+1个位置1:x >> k |(1 > k &~(1