口诀:
清零取反要用与,某一位置可用或。
若要取反和交换,轻轻松松用异或。
1.先举个例子,6的二进制是:110 ,所以 在补0 后显示为:0000 0011。
没错,如你所见,二进制在 补0后 是以 后为前的排序
2.给定整数 n与m. 进行位运算操作:1 << m
这是个非常 常用的操作,常用于:对n的第m位数进行操作。
1 << m :可谓是,定位 到 n 的第m位数,然后 n的第m位数,在与 1 进行 位运算操作。
3.基本的位运算操作
先给定整数 n,整数 m(0,1,2,3...sizeof(int))
1). & :只有对应的两个 二进制数,均为1,结果才为 1,否则为 0
& 1 :判断 n的第m位数。
介绍两个重要应用,来证明其含义:
(n >>m ) & 1 :判断 整数n 的二进制 第m位 是否 为1 或者 为0
此时,"& 1" 的重要性 就体现出来了,n 的第m位数,如果为1 ,1&1 就返回1 ,如果为0,0&1 就返回0
所以说,可以利用 &1 来判断 n的二进制数的第m位数情况,为1 还是为0
并且,还有一个特别重要的应用,n & 1,可以判断 n 的奇偶性
毕竟 如果n 为奇数,辗转相除2,最后的余数 必定为1,如果n 为偶数,辗转相除 余数必定为 0
也就是说,n为奇数,n&1 等价于 1&1 ,返回值 为1,n为偶数,n&1 等价于 0&1,返回值为 0
& 0 :将 n的第m位数,重置为0
基本应用:n & ~(1 << m)
第一步:1 << m : 定位到 n的第m位数
第二步:~(1 << m):将1进行非运算,变为 0,其他剩下的m位,变成 1,而 &1,是无实际作用的
第三步:n & 0 :& 按位与运算:只有对应的两个数 全部为1时,结果才为1,而&0,显而易见,返回值一定为 0
2). | :只有对应的两个 二进制数,均为0,结果才为 0,否则为 1
| 1 :将 n的第m位数,重置为1
基本应用:n | (1 << m):
第一步:1 << m : 定位到 n 的第m位数
第二步:n | 1 :n的第m位数 进行 |1 操作 其返回值必定为 1!因为|只有,两个数都为 0时,结果才为 0
| 0:一定要清楚, 是 n的第m位数 在进行操作,其他 位数操作,根本无 影响
因为,其他位数,是 在进行 "| 0" 操作,而所谓的 |0 操作,与 &1 操作,毫无差别,都是无实际作用的
假设 k=n的第m位数,k = 1 ,k|0 = 1|0 = 1,k = 0,k|0 = 0|0 = 0,所谓 无实际作用就是如此
但是要注意一点,我说的 0 是在二进制数中的0,有实际含义的 0,不是补 0的0
所以,可以感性的认识到,| 0 与 & 1 以及 下文的 ^ 0,都是无实际作用的
3). ^ :只有对应的两个 二进制数相等时,结果才为 0,否则为 1
^ 1: 将 n的第m位数,取反
基本应用:n ^ (1 << m)
第一步:1 << m : 定位到 n的第m位数
第二步:n ^ 1,我们要知道,^ (异或):不相等为 1,相等为 0
而 ^1:如果 n的第m位数 为1,1^1 返回值为 0,如果 n的第m位数 为0,0^1 返回值 为1
所以,^1 的重要作用,就是 与之相反的作用
^ 0: 与 上文提到的 & 1 ,| 0 相似,都是无实际含义的操作
假定 整数k 为0,k^0 = 0^0 = 0 ; 假定整数k 为1,k^0 = 1^0 = 1
所以说,无论怎么变化,^0 都是无实际作用的
总结:(n >> m) & 1 == (n >> m) | 0 == (n >> m) ^ 0
n & ~(1 << m) : 将 n的第m位数,重置为 0
n | (1 << m) : 将 n的第m位数,重置为 1
n ^ (1 << m) : 将 n的第m位数,取其相反