程序中的所有数在计算机内存中都是以二进制的形式存储的。位运算就是直接对整数在内存中的二进制位进行操作。
这篇文章就介绍一下C语言中简单的位运算操作。
按位与:a & b
相同位的两个数字都为1,则为1;若有一个不为1,则为0。
00101
11100
---------------
00100
按位或:a | b
相同位只要一个为1即为1。
00101
11100
--------------
11101
按位异或。a ^ b
相同位不同则为1,相同则为0。
00101
11100
任何一个数字异或它自己都等于0。
如果有一个数组只有一个数字出现了一次,其他的都出现了两次从头到尾异或数组中的每一个数组,最终的结果刚好是那个只出现一个的数字。
-----------
11001
按位取反。~a
把内存中的0和1全部取反.
010
------
101
左移。a << b
把a转化为二进制后左移b位(在后面添b个0),相当于a乘以2的b次方。例如100的二进制为1100100,而110010000转成十进制是400,那么100 << 2 = 400.
带符号右移。a >> b
把a转化为二进制后右移b位(去掉末尾b位),相当于a除以2的b次方。然后把前面补齐,如果数字原先是一个正数,则右移之后在最左边补b个0,如果数字原先是负数,则右移之后在最左边补齐b个1,因为负数在计算机内部是补码表示的。
通常认为位运算是更快的,因为是底层的操作,所以当我们需要乘2或者除2时尽量用位运算来完成。
对于二进制数n,
判断第i位是否为1:
n & (1 << i)
修改第i位数字为0:
n & ~(1<<i)
修改第i位数字为1
n |= (1 << i)
修改b第i位数得到一个新数a
a = b ^ (1 << i)