计算机中二进制

左移 << : 二进制左移一位就是在末尾加 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

上有不足请多多指出 各位看官