位运算基础
位运算概述:
在现代计算机中所有的数据都以二进制的形式存储在设备中,即0、1两种状态。
计算机对二进制进行的运算(+、-、*、/)都叫位运算。
例如:
int a = 25;
int b = 13;
int c = a + b;
计算a+b的值,在计算机中就是以二进制进行运算的。所以上面我们所给的int变量会在机器内部先转换为二进制在进行相加:
25: 0 0 0 1 1 0 0 1
13: 0 0 0 0 1 1 0 1
————————————————————
38: 0 0 1 0 0 1 1 0
位运算符
| 含义 | 运算符 | 例子 |
|---|---|---|
| 左移 | << | << 0011 => 0110 |
| 右移 | >> | >> 0110 => 0011 |
| 按位或 | | | 0011 | 1011 => 1011 |
| 按位与 | & | 0011 & 1011 => 1100 |
| 按位取反 | ~ | ~0011 => 1100 |
| 按位异或(相同为零不同为1) | ^ | 0011 ^ 1011 => 1000 |
关于优先级
位运算的优先级低于算术运算符(除了取反),而按位与、按位或以及异或低于比较运算符,所以使用时需多加注意,在必要时添加括号。
注意事项
- 在处理整型数值时,可以直接对组成整型数值的各个位进行操作。这意味着可以使用屏蔽技术获得整数中的各个位。
- 对于 int32 型,1 << 35 与 1 << 3 是相同的。
性质
- 交换律 可任意交换运算因子的位置,结果不变
- 结合律 (即 ( A ^ B ) ^ C == A ^ ( B ^ C ))
- 对于任何数 X ,都有 X ^ X = 0, X ^ 0 = X, 同自己求异或为0,同0求异或为自己
- 自反性 A ^ B ^ B = A ^ 0 = A ,连续和同一个因子做异或运算,最终结果为自己
经典运用
不用加减乘除做加法
//step1:异或查看两个数进行加法操作后的结果
//step2:与运算计算出想对应的位置的进位结果,然后左移一位
//b代表的是两数相加是否有进位,有的话就继续,没有的话就结束得出相加后的答案
func Add(a,b int) int{
for b != 0 {
temp := a ^ b//计算出相对应的位置相加后的结果
b = (a & b) << 1//计算出想对应的位置的进位,然后左移一位
a = temp
}
return a
}
二进制中1的个数
func NumberOf1(a int) int{
if a == 0||a == 1 {
return a
}
count := 0
for a != 0 {
count++
a = a & (a-1)
}
return count
}
不使用第三个变量的情况下交换两个变量的值
//原理:运用异或的特性
//A ^ B = C --> C ^ A = B --> C ^ B = A
func Exchange(x,y int){
x = x ^ y
y = x ^ y
x = x ^ y
}
其他运用
- 判断一个数的奇偶性
func IsOdd(a int) bool{
if (a & 1) == 0 {
return false
}else{
return true
}
}
- 两数的平均数
func Average(a, b int) int {
return (a & b)+((a ^ b) >> 1);
}
本文来自博客园,作者:卡肉,转载请注明原文链接:https://www.cnblogs.com/carlos12138/p/15271762.html

浙公网安备 33010602011771号