• Home
  • 写文
  • 关于
    • jlweb Blog photo

      jlweb Blog

      occupied with moon theme of jelly

    • 详情
    • Github
    • Steam
  • 文章
    • 所有文章
    • 所有标签
  • 项目
  • 主站
search clear

位运算

10 Dec 2023

阅读时长 ~1 分钟

编辑

1.常用位运算操作

(1) 常用的等式: -n=~(n-1)=~n+1 (2) 获取整数n的二进制中最后一个1: n&~(n-1)或者n&(-n)。例如n=010100,则-n=101100,n&(-n)=000100。 (3) 去掉整数n的二进制中最后一个1: n&(n-1)。例如n=010100,n-1=010011,则n&(n-1)=010000。

2.如何位运算实现除2 (num/2)

  • 模拟位运算
    • 当非负数直接右移即可
    • 当负数:模拟法 补码处理
      • (num»1)
    • image.png

      这段代码模拟了正数到负数转换,由于是int8直接指定了二进制数异或,和取反~一个效果 然后就是逆向还原出除后的正数,但是这样做-1有问题结果为-1,这是因为-1补码为1111 1111 右移动 0111 1111;再逆向,先减一 0111 1110,再低7位翻转0000 0001结果还是1 ; 如果|num|>1,例如 num=-2;补码:1111 1110 -> 0111 1111->0111 1110->0000 0001 -7 补码:1111 1001 -> 0111 1100 -> 0111 1011 -> 0000 0100 (-4)

修正:还原为正数再右移即可 image.png

  • 最终正解 x=num
    • if(x<0) ((x-1)»1)+1
    • else x»1
    • image.png
    • 例如+7 和 -7:
      • 0000 0111
      • 1111 1001
      • (a»1)+(−a»1)+1
        • 0000 0011 + 0111 1100 + 1 = 0111 1111 + 1= 1000 0000 =-128


🥁-Algorithm Share Tweet +1