• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

位运算基础

开发技术 开发技术 5小时前 2次浏览

位运算概述:

在现代计算机中所有的数据都以二进制的形式存储在设备中,即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

关于优先级

位运算的优先级低于算术运算符(除了取反),而按位与、按位或以及异或低于比较运算符,所以使用时需多加注意,在必要时添加括号。

注意事项

  1. 在处理整型数值时,可以直接对组成整型数值的各个位进行操作。这意味着可以使用屏蔽技术获得整数中的各个位。
  2. 对于 int32 型,1 << 35 与 1 << 3 是相同的。

性质

  1. 交换律 可任意交换运算因子的位置,结果不变
  2. 结合律 (即 ( A ^ B ) ^ C == A ^ ( B ^ C ))
  3. 对于任何数 X ,都有 X ^ X = 0, X ^ 0 = X, 同自己求异或为0,同0求异或为自己
  4. 自反性 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);
}

程序员灯塔
转载请注明原文链接:位运算基础
喜欢 (0)