# 1.int类型的二进制码
# int类型数字a在底层的二进制对应的是什么呢?
我们有这样一段代码var a int = 1,我们声明了一个整数类型的 a ,我们之前知道计算机底层是由二进制表示的,那么 a 究竟在计算机底层是怎么表示的呢?

需求:将整形a对应的二进制表示打印输出到控制台,其实就是确定每一位上是0还是1。
我们知道 golang 的 int 类型跟随计算机的系统位数适配,目前大家一般使用的都是64位的系统,所以使用64位进行说明。
那我们在代码中使用的a,底层的二进制具体是什么样子的呢?由于计算式是由二进制来表达数据的,而且我们也知道了,int 类型是 64 位,那么int类型每一位的具体值我们可以怎么知道呢?10 进制的 1, 我们很容易推算出1的二进制码,实际上1的二进制码确实如下图,最后一个位置为1,其余都是0:

怎么验证我们的想法呢?我们需要学习下二进制的运算符,最后我们用代码打印 a 在计算下二进制的表示。
# 位运算的基本符号
# 位运算 &(与)
如下图所示,以下展示 a & b 的二进制运算结果:

我们可以看出,相同位置下,a,b同时为1,则c该位置也为1。但凡一个位置不为1则当前位置为0。
# 位运算 |(或)

我们可以看出,相同位置下,a,b同时为0,则c该位置也为0。但凡一个位置不为0则当前位置为1。
# 位运算 >> (左移)

golang 的 >> 为带符号位左移,如图中所示,a 的最高位为符号位,如果该位为1,则a整体右移后,最高位补上符号位的值。所以a >> 1 后的具体值位为b,如果a最高位为0,则为下图所示:

# 位运算 <<(右移)

整形 a 左移1位后为b,具体为 a 整体向左边移动1位,最后1位补零,左移1位后的具体值为b。
# 位运算 ^ (异或)

三者关系: a ^ b = c
a 与 b 异或时,当两者相同位置的值相同时,异或后的值则为0,当两者的位置值不同是,异或后的结果值为1。
# 位运算 ^ (非)

非运算如图所示,每一位的值如果是0则取反后为1,如果是1则取反后为0。
注意: golang 中 非(^) 与异或(^) 使用的是同一个符号,如何区分? 如果^在两数之间则是异或,如果^在变量开头,则^表示非运算
# 打印a的二进制
我们知道a有64位,所以我们需要循环64次,去判断每一个位置下,到底是0还是1,判断完毕后则可以知道,该数的二进制表达。

如上图,其中示例我们如何取到最高位,我们将1左移63位,移动到最高位后,与 a 相与,结果位0,则证明该位置位0,所以答案的最高位为0,同理取次高位直到取完,即可得到a的二进制表达。
具体代码如下:
func GetBinary(val int) string {
res := ""
for i:=63; i>=0; i-- {
if val & (1<<i ) == 0 {
res += "0"
} else {
res += "1"
}
}
return res
}
2
3
4
5
6
7
8
9
10
11