计算机中二进制
左移 << : 二进制左移一位就是在末尾加 0 (还要考虑到数字的溢出)
举例: 二进制 0111 左移一位就是 01110
0111 的 十进制为 7 = 0*2^3+1*2^2+1*2^1+1*2^0 = 0+4+2+1
01110 的 十进制为14 =0*2^4+1*2^3+1*2^2+12^1+0*2^0 = 0+8+4+2+0
左移n位 <<n 在末尾添加n个0
举例 :0111左移三位 0111000
0111000 = 0*2^6+1*2^5+1*2^4+1*2^3+0*2^2+0*2^1+0*2^0 = 56
总结:
左移 1位就是在原有的基础上 numer * 2^1
移动三位就是 number * 2^3
n位就是number *2^n
右移 >>逻辑右移 >>> 算术右移
二进制的 的右移 >> : 就是抹掉右边的一位数
举例:0111 右移一位 0111>>1 = 011
0111 = 7
011 = 3
右移两位 0111 >>2 = 01
011 = 3
01 = 1
总结
右移一位就是 number / 2^1 取整 7/2 = 3.5 取整 =3
右移n位就是 number / 2^N 将数字除以2^n 取整
举例 0111000 右移三位 即0111
56 / 2^3 = 56/8 = 7
这篇文章可以看一下 逻辑右移 和 算术右移
位的“或”:二进制中的 “1”和“0” 表示真假 对位中有1 的最终为1 其他的则为0
二进制: 11000101
二进制: 00010110
“或”结果为: 11010111
位的“与:对位中同时为1 结果才为1 否则 为0
二进制: 11000101
二进制: 00010110
“与”结果为: 00000100
位的“异或”:与“或”不同,也即是 对位相同的反而为 0 不同的为1
二进制: 100101101
二进制: 101001010
“异或”的结果为:001100111
注:这里的对位相同 不区分是 0 还是1 , 0 对上0 是0 ,1 对上1 是0 , 只有 1对上0 或 1对上0 才是 1
谈谈Golang 中的 常量const
官方文档 连接 就不做过多的解释了
Golang 中的 按位置零 &^ 右边二进制位为 0 结果 等于 左边二进制位 ,右边二进制位为1 其结果等于0
1 &^ 0 1
1 &^ 1 0
1 &^ 1 0
0 &^ 0 0
Golang中的按位置零:
也即是 右边的二进制位 为 0 左边的二进制位 无论为 0 或1 其结果 等于 左边的二进制位
右边的二进制位为 1 左边的二进制位 无论 0 或 1 其结果都为 0
关于Golang 中的 iota 请参考
const iota &^ 代码流程
对于 a = a&^Writeable 的两种计算方式
a = 7 二进制 0111
Writeable 的二进制位 0010 也即是 2
计算方式一:&^ 可以拆解为 先算 & 再算 ^
【计算方式一 第一步】
&计算 (采用0 补位 便于观察)
a 0111
Writeable 0010
计算结果: a&Writeable = 0010=2 = res
将a&Writeable 的结果 res 在与a进行 ^ 计算
【计算方式一 第二步】
计算res与a 的 ^
res 0010
a 0111
计算结果:res^a = 0101 = 5
所以 a&^Writeable = 5 = res1
【验证结果】
关于 a&Writeable==Writeable的解释
res1 的二进制 0101 = 5
Writeable的二进制 0010 = 4
&计算
0101
0010
计算结果: 0000 = 0
0==2 false
【计算方式二】
用之前提到的Golang 中的&^ 直接计算
右边的二进制位 为 0 左边的二进制位 无论为 0 或1 其结果 等于 左边的二进制位
右边的二进制位为 1 左边的二进制位 无论 0 或 1 其结果都为 0
a 的二进制 0111
Writeable 的二进制 0010
左边是a的二进制 右边是Writeable 的二进制
0 &^ 0
1 &^ 0
1 &^ 1
1 &^ 0
计算结果 从上往下 0101 =5 可以发现与计算方式一得到的结果一致
到此为止&^计算方式分析完。
在计算一下 a&^isDelete
从上分析 a 的二进制 0111 isDelete的二进制 1000
在按照计算方式二计算一下
依然是 左边a 右边 isDelete
0&^1
1&^0
1&^0
1&^0
计算结果0111 = 7
上有不足请多多指出 各位看官