# 1.int类型的二进制码

# int类型数字a在底层的二进制对应的是什么呢?

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

image-20230318231253705

需求:将整形a对应的二进制表示打印输出到控制台,其实就是确定每一位上是0还是1。

我们知道 golang 的 int 类型跟随计算机的系统位数适配,目前大家一般使用的都是64位的系统,所以使用64位进行说明。

那我们在代码中使用的a,底层的二进制具体是什么样子的呢?由于计算式是由二进制来表达数据的,而且我们也知道了,int 类型是 64 位,那么int类型每一位的具体值我们可以怎么知道呢?10 进制的 1, 我们很容易推算出1的二进制码,实际上1的二进制码确实如下图,最后一个位置为1,其余都是0:

image-20230318231540177

怎么验证我们的想法呢?我们需要学习下二进制的运算符,最后我们用代码打印 a 在计算下二进制的表示。

# 位运算的基本符号

# 位运算 &(与)

如下图所示,以下展示 a & b 的二进制运算结果:

image-20230318233056615

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

# 位运算 |(或)

image-20230318233552382

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

# 位运算 >> (左移)

image-20230319001007179

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

image-20230319001319042

# 位运算 <<(右移)

image-20230319000646452

整形 a 左移1位后为b,具体为 a 整体向左边移动1位,最后1位补零,左移1位后的具体值为b。

# 位运算 ^ (异或)

image-20230319001641487

三者关系: a ^ b = c

a 与 b 异或时,当两者相同位置的值相同时,异或后的值则为0,当两者的位置值不同是,异或后的结果值为1。

# 位运算 ^ (非)

image-20230319002053328

非运算如图所示,每一位的值如果是0则取反后为1,如果是1则取反后为0。

注意: golang 中 非(^) 与异或(^) 使用的是同一个符号,如何区分? 如果^在两数之间则是异或,如果^在变量开头,则^表示非运算

# 打印a的二进制

我们知道a有64位,所以我们需要循环64次,去判断每一个位置下,到底是0还是1,判断完毕后则可以知道,该数的二进制表达。

image-20230319003651197

如上图,其中示例我们如何取到最高位,我们将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
}
1
2
3
4
5
6
7
8
9
10
11
上次更新: 2/29/2024,