位运算
Posted banshaohuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位运算相关的知识,希望对你有一定的参考价值。
位运算
位运算介绍
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。比如, and 运算本来是一个逻辑运算符,但整数与整数之间也可以进行 and 运算。举个例子, 6 的二进制是 110 , 11 的二进制是 1011 ,那么 6 and 11 的结果就是 2 ,它是二进制对应位进行逻辑运算的结果( 0 表示 Fase , 1 表示 True ,空位都当 0 处理)。
由于位运算直接对内存数据进行操作不需要转成十进制,因此处理速度非常快。
符号 | 描述 | 运算规则 |
---|---|---|
& | 与 | 两个位都为 1 时,结果才为 1 |
| | 或 | 两个位都为 0 时,结果才为 0 |
^ | 异或 | 两个位相同为 0 ,相异为 1 |
- | 取反 | 0 变 1,1 变 0 |
<< | 左移 | 各二进位全部左移若干位,高位丢弃,低位补 0 |
>> | 右移 | 各二进位全部右移若干位,对无符号数,高位补 0 ,有符号数,各编译器处理方法不样,有的补符号位(算术右移),有的补 0 (逻辑右移) |
异或操作的一些特点:
x ^ 0 = x
x ^ 1s =~x // 1s = ~0
x ^ (~x) = 1
x ^ x = 0 // interesting and important!
a ^ b = c => a ^ c = b, b ^ c = a //swap
a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c // associative
位运算常用操作
写程序时,尤其是在刷算法题时比较能用到的操作。
X & 1 == 1 OR == 0 判断奇偶(x % 2 == 1)
X = X & (X - 1) => 清零最低位的 1
X & - X => 得到最低位的 1
更加复杂的位运算操作
- 将 ⅹ 最右边的 n 位清零
- x & (~0<<n)
- 获取 ⅹ 的第 n 位值( 0 或者 1 ) -
(ⅹ>>n) & 1
- 获取 ⅹ 的第 n 位的幂值 -
x & (1<<(n-1))
- 仅将第 n 位置为 1 -
x | (1<n)
- 仅将第 n 位置为 0 -
x & (~(1<<n))
- 将 ⅹ 最高位至第 n 位(含)清零 -
ⅹ & ((1<<n)-1)
- 将第 n 位至第 0 位(含)清零 -
ⅹ& (~(1≤<(n+1))-1)
以上是关于位运算的主要内容,如果未能解决你的问题,请参考以下文章
Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)只出现一次的数字
Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)只出现一次的数字