原码、反码、补码
一、二进制在运算中的说明
二进制是逢 2 进位的进位制,0、1 是基本算符。
现代的电子计算机技术全部采用的是二进制,因为它只使用 0、1 两个数字符号,非常简单方便,
易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。二进制(Binary)数用 0
和 1 两个数字及其组合来表示任何数。进位规则是“逢 2 进 1”,数字 1 在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增。
二、原码、反码、补码
对于有符号的而言
二进制的最高位是符号位:0表示正数,1表示负数
1 => [0000 0001]
-1=> [1000 0001]
正数的原码、反码、补码都一样
负数的反码 = 它的原码符号位不变,其他取反(0->1 , 1->0)
负数的补码 = 它的反码+1
1 ==> 原码 [0000 0001] 反码[0000 0001] 补码[0000 0001]
-1 ==> 原码 [1000 0001] 反码[1111 1110] 补码[1111 1111]
0的反码,补码都是0
在计算机运算的时候,都是以补码的方式来计算的
1+1 1-1 = 1+(-1)
三、位运算符
Golang 中有 3 个位运算
- 按位与&
- 按位或|
- 按位异或^
分别是”按位与&、按位或|、按位异或^,它们的运算规则是:
按位与& : 两位全为1,结果为 1,否则为 0
按位或| : 两位有一个为 1,结果为 1,否则为 0
按位异或 ^ : 两位一个为 0,一个为 1,结果为 1,否则为 0
案例:
package main
import "fmt"
func main(){
fmt.Println(2&3)//2
fmt.Println(2|3)//3
fmt.Println(2^3)//1
fmt.Println(-2^3)//4
}
//2&3
//2的补码 0000 0010
//3的补码 0000 0011
//2&3 0000 0010 =>2
//2|3 0000 0011 =>3
//2^3 0000 0001 =>1
//-2^2
//-2的原码 1000 0010
//-2的反码 1111 1101
//-2的补码 1111 1110
//2 的补码 0000 0010
//-2^2
//-2的补码 1111 1110
//2 的补码 0000 0010
//-2^2 1111 1100 (补码)
//-2^2 1111 1011 (反码)
//-2^2 1000 0100 (原码) => 4
为什么
-2^2
的时候不是用补码,而是用原码,其他运算不都是补码吗?前面也讲到计算机的运算其实是补码运算!
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: