持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
一、原码,反码,补码
有符号的二进制数
- 进制的最高位是符号位: 用0表示正数,用1表示负数
1 ===> 0000 0001
-1 ===> 1000 0001
- 正数的原码,反码,补码都一样
| 1 | |
|---|---|
| 原码 | 0000 0001 |
| 反码 | 0000 0001 |
| 补码 | 0000 0001 |
-
负数的反码 = 原码符号位不变,其他位取反
-
负数的补码 = 负数的反码 + 1 | | -1| | --- | --- | | 原码 | 1000 0001 | | 反码 | 1111 1110 | | 补码 | 1111 1111 |
-
0的反码,补码都为 0
-
计算机运行时,都是用补码进行运算
二、位运算
| 位运算 | 运算规则 |
|---|---|
| 按位与 & | 两位全为1,结果为1,否则为0 |
| 按位或 | | 两位有一个为1,结果为1,否则为0 |
| 按位异或 ^ | 两位一个为0,一个为1,结果为1,否则为0 |
案例演示
这里采用 2 和 3 进行运算
正数
2 补码为 0000 0010
3 补码为 0000 0011
负数
-2 补码 1111 1110
-3 补码 1111 1101
package main
import "fmt"
func main() {
// 正数
// 2 补码为 0000 0010
// 3 补码为 0000 0011
// 负数
// -2 补码 1111 1110
// -3 补码 1111 1101
// 按位与 0000 0010
fmt.Println("按位与 ==> ", 2&3) // 2
// 按位或 0000 0011
fmt.Println("按位或 ==> ", 2|3) // 3
// 按位异或 0000 0001
fmt.Println("按位异或 ==>", 2^3) // 1
fmt.Println("按位异或 ==>", 2^-2) // -4
}
三、移位运算
| 移位运算 | 运算规则 |
|---|---|
| 右移位运算符>> | 低位溢出,符号位不变并用符号位补溢出的高位 |
| 左移位运算符<< | 符号位不变,低位补0 |
案例演示 这里采用 1 作为演示
1 用二进制表示为 0000 0001
package main
import "fmt"
func main() {
// 1 二进制表示为 0000 0001
// 定义变量,右移2位
a := 1 >> 2 // 0000 0001 ==> 0000 0000
fmt.Println("a = ", a)
// 定义变量,左移3位
b := 1 << 3 // 0000 0001 ==> 0000 1000
fmt.Println("b = ", b)
}