【一Go到底】第十天---位运算and移位运算符

104 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

一、原码,反码,补码

有符号的二进制数

  1. 进制的最高位是符号位: 用0表示正数,用1表示负数
 1 ===> 0000 0001
-1 ===> 1000 0001
  1. 正数的原码,反码,补码都一样
1
原码0000 0001
反码0000 0001
补码0000 0001
  1. 负数的反码 = 原码符号位不变,其他位取反

  2. 负数的补码 = 负数的反码 + 1 | | -1| | --- | --- | | 原码 | 1000 0001 | | 反码 | 1111 1110 | | 补码 | 1111 1111 |

  3. 0的反码,补码都为 0

  4. 计算机运行时,都是用补码进行运算

二、位运算

位运算运算规则
按位与 &两位全为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)
}