首页 > 其他 > 详细

位运算的技巧

时间:2019-07-07 12:26:15      阅读:76      评论:0      收藏:0      [点我收藏+]
  • 异或(^)

运算规则:\(1,0 \rightarrow 1\)可以抽象的理解为不进位加法

异或的性质:\(A\)^\(A=0\)

? \(A\)^\(0=A\)

例题:有一些数两两重复,除了一个数落单,不开辟额外空间,找到那个数。

思路:让数组内的所有数进行异或运算,最后的结果就是落单的数。


  • 与(&)

运算规则:\(1,1\rightarrow1\)

例题①:求一个二进制数1的个数

思路

1.将数一直>>并与1进行与运算,为true就将个数+1。

2.一直对该数与该数-1进行与运算(-1后从低位开始到第一个1之间的所有0都变为1,第一个1变为0,这样与初始数与就可以把第一个变为0),直到这个数等于0,统计次数。

例题②:判断一个数是否是2的整数次方。

思路:要让这个数是2的整数次,那么这个数的二进制只有一个1。所以可以用用例题①的思路2来解,让这个数和这个数-1进行一次与运算,判断是否是0即可。


  • 将二进制数奇偶位互换

思路:将这个数分别和\(0xaaaaaa\)(1010 1010 1010...取出偶数位\(0x555555\)(0101 0101 0101...取出奇数位)作与(&)运算。再将保留偶数位的右移一位,保留奇数位左移一位,然后作异或(^)运算。


  • 0-1之间浮点数的表示(乘2,挪整)

方法:整个数\(*2\),取出整数位(从左向右排布),再\(*2\),直到为\(0\)

举例:\(0.625\)

  1. \(0.625*2=1.25\),取出\(1\),则这个二进制数为\(0.1\),该数变为\(0.25\)
  2. \(0.25*2=0.5\),取出0,二进制数变为\(0.10\),该数变为\(0.5\)
  3. \(0.5*2=1\),取出1,而金属变为\(0.101\),该数变为\(0\),结束循环

  • 有一些数出现\(k\)次,一个数出现\(1\)次,求出现\(1\)次的那个数

Tips\(k\)\(k\)进制数作不进位加法运算,结果为0

方法:有了Tips那么这道题思路应该就清晰了,首先当然要把所有的数转换为\(k\)进制数啦,然后再把每个数对应为相加,与\(k\)取余,再拼起来就是答案辣!

位运算的技巧

原文:https://www.cnblogs.com/JMWan233/p/11145107.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!