Golang 操作运算符

位运算

位操作含义备注
&按位与两个操作数对应的二进制位,都为1则为1,否则为0
按位或两个操作数对应的二进制位,有1则为1,否则为0
~按位非两个操作数对应的二进制位,取反操作,1则为0,0则为1
^异或两个操作数对应的二进制位,相同为0,相异为1
<<左移将二进制位全部左移n位,相当于乘以2的n次方,如1<<6 相当于1×64=64
>>右移将二进制位全部右移n位,相当于除以2的n次方,如64>>3 相当于64÷8=8

常见操作

  • 快速交换2个数字值

    var a=5
    var b=99
    a=a^b
    b=a^b
    a=a^b
    fmt.Println(a==99)
    fmt.Println(b==5)
    

    任何数与自己异或为0,与0异或为自己。
    a=a^b;
    b=a^b; (把a=a ^ b 代入 b=a ^b ^b , b=a ^b ^b ,b=a ^0,b=a)
    a=a^b; (把a=a ^ b 代入 a=a ^b ^b ,a=a ^b ^a ,a=b ^0,a=b)

  • 判断奇偶数

    var a = 10
    var b=11
    a & 1 =0
    b & 1 =1
    

    原理:

    ​ 任何偶数的二进制的第一位都是 0 如2 ==> 0010

    ​ 任何奇数的二进制的第一位都是 1 如1 ==> 0001

    所以只需要 按位与 1 判断最后一位 是0还是1即可

  • 乘除法运算

    乘数和除数必须是2的n次方才可以,利用左右移的原理

    var a=4
    var b=16
    a=a*4;
    b=b/4;
    // 可以改为:
    a=a<<2;
    b=b>>2;
    

    说明:
      除2 = 右移1位 乘2 = 左移1位
      除4 = 右移2位 乘4 = 左移2位
      除8 = 右移3位 乘8 = 左移3位

  • 交换符号

    var a=1 // 0001
    a=~a + 1  // 1110
    fmt.Println(a==-1)
    a=~a + 1
    fmt.Println(a==1)
    

    整数取反加1,正好变成其对应的负数(补码表示);负数取反加一,则变为其原码,即正数

    https://blog.csdn.net/shenhaiwen/article/details/79001039

  • 判断一个数是正负数

    整数右移 31 位得到 0,负数右移 31 位得到 -1

    var a=10
    var b=-10
    if a>>31 == 0 {
      fmt.Println("a是正数")
    }
    if b>>31 == -1 {
      fmt.Println("b是负数")
    }
    
  • 求绝对值

    整数的绝对值是其本身,负数的绝对值正好可以对其进行取反加一求得,即我们首先判断其符号位,然后根据符号进行相应的操作

    var a=10
    if a >> 31 ==0 {
      // 整数直接返回
      return a
    }
    // 负数
    a=^a+1
    
  • 高低位交换

    // 34520的二进制表示:
    // 10000110 11011000
    
    // 将其高8位与低8位进行交换,得到一个新的二进制数:
    // 11011000 10000110
    // 其十进制为55430
    var a = 34520;
    a = (a >> 8) | (a << 8);
    

    从上面移位操作我们可以知道,只要将无符号数 a>>8 即可得到其高 8 位移到低 8 位,高位补 0;将 a<<8 即可将 低 8 位移到高 8 位,低 8 位补 0,然后将 a>>8 和 a<<8 进行或操作既可求得交换后的结果。

  • 二进制逆序

    https://www.zhihu.com/question/38206659/answer/736472332

参考资料

操作运算符

有劳各位看官 点赞、关注➕收藏 ,你们的支持是我最大的动力!!!
同时也欢迎大家在评论区提问、分享您的经验和见解!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五岁小孩吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值