位运算

  • 位运算思考题
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)
}
func main() {
fmt.Println(2&3) //位与
fmt.Println(2|3)  //位或
fmt.Println(13&7) 
fmt.Println(5|4) //? 
fmt.Println(-3^3) //?//位异或
}

原码、反码、补码

对于有符号的数而言:
1、二进制的最高位是符号位:0表示正数,1表示负数;

示例 1-1byte(8位)类型在内存中表示为:1 ==> [0000 0001] -1 ==> [1000 0001]

2、正数的原码,反码,补码都一样;
3、负数的反码 = 它的原码符号位不变,其它位取反0->1 1->0
4、负数的补码 = 反码 + 1

1 ==> 原码 [0000 0001] 反码 [0000 0001] 补码 [0000 0001]
-1 ==> 原码 [1000 0001] 反码 [1111 1110] 补码 [1111 1111]

5、0的反码,补码都是0
6、在计算机运算的时候,都是以补码的方式运算的

只有+ 没有-
1-1 = 1 + (-1)

位运算符和移位运算符

  • Golang 中有3 个位运算
    分别是 按位与&按位或|按位异或^,它们的运算规则是:

按位与& : 两位全为1,结果为1,否则为0

按位或| : 两位有一个为1,结果为1,否则为0

按位异或^ : 两位一个为0,一个为1,结果为1,否则为0

  • 案例练习
    2&3=? 2|3=? 2^3=? -2^2
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 反码 1111 1101 补码 + 1 == 1111 1110
                                    2 的补码 0000 0010
运算的补码是 1111 1100 -> -1为反码 1111 1011 -> 原码 1000 0100 ==如果是 -4
  • Golang 中有2 个移位运算符:

>><<右移和左移
运算规则:
右移运算符>>:低位溢出,符号位不变,并用符号位补溢出的高位
左移运算符<<: 符号位不变,低位补0

案例:

a := 1 >> 2 // 0000 0001 =>0000 0000 = 0
c := 1 <<2 //  0000 0001 => 0000 0100 = 4
//源码
package main
import (
    "fmt"
)
func main (){
    fmt.Println(2&3)
    fmt.Println(2|3)
    fmt.Println(2^3)
    fmt.Println(-2^2)
    fmt.Println(1 >> 2)
    fmt.Println(1 << 2)
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。