一 问题提出
1 请看下面的代码段,回答 a,b,c,d 结果是多少?
func main() {
var a int = 1 >> 2
var b int = -1 >> 2
var c int = 1 << 2
var d int = -1 << 2
//a,b,c,d 结果是多少
fmt.Println("a=", a)
fmt.Println("b=", b)
fmt.Println("c=", c)
fmt.Println("d=", d)
}
2 请回答在 Golang 中,下面的表达式运算的结果是什么?
func main() {
fmt.Println(2&3)
fmt.Println(2|3)
fmt.Println(13&7)
fmt.Println(5|4)
fmt.Println(-3^3)
}
二 二进制在运算中的说明
二进制是逢 2 进位的进位制,0、1 是基本算符。
现代的电子计算机技术全部采用的是二进制,因为它只使用 0、1 两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。二进制(Binary)数用 0和 1 两个数字及其组合来表示任何数。进位规则是“逢 2 进 1”,数字 1 在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增。
在计算机的内部,运行各种运算时,都是以二进制的方式来运行。
三 实战
1 代码
package main
import (
"fmt"
)
func main() {
var a int = 1 >> 2
var b int = -1 >> 2
var c int = 1 << 2
var d int = -1 << 2
// a,b,c,d 结果是多少
fmt.Println("a=", a)
fmt.Println("b=", b)
fmt.Println("c=", c)
fmt.Println("d=", d)
fmt.Println(2&3)
fmt.Println(2|3)
fmt.Println(13&7)
fmt.Println(5|4)
fmt.Println(-3^3)
}
2 测试
a= 0
b= -1
c= 4
d= -4
2
3
5
5
-2
四 原码、反码、补码
对于有符号整数而言
1 二进制的最高位是符号位:0表示正数,1表示负数。
1 => 0000 0001
2 正数的原码,反码,补码都一样。
3 负数的反码=它的原码符号位不变,其他位取反。
1 原码(0000 0001) 反码(0000 0001) 补码(0000 0001)
-1 原码(1000 0001) 反码(1111 1110) 补码(1111 1111)
4 负数的补码 = 它的反码 + 1
5 0的反码和补码都是0
6 在计算机运算的时,都是以补码的方式来运算。
加法运算:1 + 1
减法运算:1 - 1 = 1 + (-1)
五 位运算符和移位运算符
1 Golang 中有 3 个位运算
-
按位与 &
-
按位或 |
-
按位异或^
2 运算规则
- 按位与 &:两位全为1,结果为 1,否则为 0。
- 按位或 |:两位有一个为 1 ,结果为 1 ,否则为0。
- 按位异或 ^:两位一个为 0,一个为 1,结果为1,否则为 0。
六 实战
1 代码
package main
import "fmt"
func main() {
// 位运算的演示
fmt.Println(2&3) // 2
fmt.Println(2|3) // 3
fmt.Println(2^3) // 3
fmt.Println(-2^2) //-4
a := 1 >> 2 // 0
c := 1 << 2 // 4
fmt.Println("a=", a, "c=", c)
}
2 结果
2
3
1
-4
a= 0 c= 4
3 图解
七 Golang 中有的 2 个移位运算符
-
>> 右移
-
<< 左移
1 运算规则
- 右移运算符 >>:低位溢出, 符号位不变, 并用符号位补溢出的高位。
- 左移运算符 <<:符号位不变, 低位补 0。
2 演示
a := 1 >> 2 // 0000 0001 => 0000 0000 = 0
c := 1 << 2 // 0000 0001 => 0000 0100 = 4