go中位运算

一 问题提出

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

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值