位运算
位操作 | 含义 | 备注 | |
---|---|---|---|
& | 按位与 | 两个操作数对应的二进制位,都为1则为1,否则为0 | |
| | 按位或 | 两个操作数对应的二进制位,有1则为1,否则为0 | |
~ | 按位非 | 两个操作数对应的二进制位,取反操作,1则为0,0则为1 | |
^ | 异或 | 两个操作数对应的二进制位,相同为0,相异为1 | |
<< | 左移 | 将二进制位全部左移n位,相当于乘以2的n次方,如1<<6 相当于1×64=64 | |
>> | 右移 | 将二进制位全部右移n位,相当于除以2的n次方,如64>>3 相当于64÷8=8 | |
常见操作
-
快速交换2个数字值
var a=5 var b=99 a=a^b b=a^b a=a^b fmt.Println(a==99) fmt.Println(b==5)
任何数与自己异或为0,与0异或为自己。
a=a^b;
b=a^b; (把a=a ^ b 代入 b=a ^b ^b , b=a ^b ^b ,b=a ^0,b=a)
a=a^b; (把a=a ^ b 代入 a=a ^b ^b ,a=a ^b ^a ,a=b ^0,a=b) -
判断奇偶数
var a = 10 var b=11 a & 1 =0 b & 1 =1
原理:
任何偶数的二进制的第一位都是 0 如2 ==> 0010
任何奇数的二进制的第一位都是 1 如1 ==> 0001
所以只需要 按位与 1 判断最后一位 是0还是1即可
-
乘除法运算
乘数和除数必须是2的n次方才可以,利用左右移的原理
var a=4 var b=16 a=a*4; b=b/4; // 可以改为: a=a<<2; b=b>>2;
说明:
除2 = 右移1位 乘2 = 左移1位
除4 = 右移2位 乘4 = 左移2位
除8 = 右移3位 乘8 = 左移3位 -
交换符号
var a=1 // 0001 a=~a + 1 // 1110 fmt.Println(a==-1) a=~a + 1 fmt.Println(a==1)
整数取反加1,正好变成其对应的负数(补码表示);负数取反加一,则变为其原码,即正数
https://blog.csdn.net/shenhaiwen/article/details/79001039
-
判断一个数是正负数
整数右移 31 位得到 0,负数右移 31 位得到 -1
var a=10 var b=-10 if a>>31 == 0 { fmt.Println("a是正数") } if b>>31 == -1 { fmt.Println("b是负数") }
-
求绝对值
整数的绝对值是其本身,负数的绝对值正好可以对其进行取反加一求得,即我们首先判断其符号位,然后根据符号进行相应的操作
var a=10 if a >> 31 ==0 { // 整数直接返回 return a } // 负数 a=^a+1
-
高低位交换
// 34520的二进制表示: // 10000110 11011000 // 将其高8位与低8位进行交换,得到一个新的二进制数: // 11011000 10000110 // 其十进制为55430 var a = 34520; a = (a >> 8) | (a << 8);
从上面移位操作我们可以知道,只要将无符号数 a>>8 即可得到其高 8 位移到低 8 位,高位补 0;将 a<<8 即可将 低 8 位移到高 8 位,低 8 位补 0,然后将 a>>8 和 a<<8 进行或操作既可求得交换后的结果。
-
二进制逆序
https://www.zhihu.com/question/38206659/answer/736472332
参考资料
有劳各位看官 点赞、关注➕收藏
,你们的支持是我最大的动力!!!
同时也欢迎大家在评论区提问、分享您的经验和见解!!!