Bit Manipulation

Posted xero10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bit Manipulation相关的知识,希望对你有一定的参考价值。

number of 1 bits: https://leetcode.com/problems/number-of-1-bits/

n &= n - 1; 一次可以去掉一个1,记录到 n == 0 执行的次数

 

Missing Number: https://leetcode.com/problems/missing-number/

将0 ~ N和所有的元素XOR

 

 

Single Number: https://leetcode.com/problems/single-number/

因为0 ^ A == A && A ^ A == 0,所以将所有的元素xor起来即可

 

Single Number II: https://leetcode.com/problems/single-number-ii/

记住就行。当一个数第一次出现时xor到ones,第二次出现从ones移除,xor到twos,第三次出现从twos移除。一个比较general的方法参考https://leetcode.com/discuss/54970/an-general-way-to-handle-all-this-sort-of-questions

 

Single Number III: https://leetcode.com/problems/single-number-iii/

将所有的元素xor起来,只保留结果中最右边的1,然后通过将这一位是不是1将数组分成两个部分,将这两个部分分别xor起来就能得到结果。详细说明参考 https://leetcode.com/discuss/60408/sharing-explanation-of-the-solution

 

Bitwise AND of Numbers Range: https://leetcode.com/problems/bitwise-and-of-numbers-range/

当m<n,最后一位LSB肯定是0,将m、n右移,直到m == n,然后将结果左移回去

 

 

Divide Two Integers: https://leetcode.com/problems/divide-two-integers/

设置一个tmp初始化为divisor,count初始化为1,如果tmp左移一位小于等于dividend,则将其左移一位,并将count左移一位,直到tmp左移一位后不再小于dividend,将count加到result里,令dividend -= tmp,然后再将tmp初始化为divisor,重复这个过程直到dividend < divisor。注意两点:1)必须声明dd和ds为long long,因为取绝对值时INT_MIN会overflow;2)对于long long取绝对值要用labs函数

傻逼题,不值得花时间。

 

Maximum Product of Word Lengths: https://leetcode.com/problems/maximum-product-of-word-lengths/

设置一个vector key,对每一个string,key[i] |= 1 << (word[i][j] - 'a'),j是一个string中所有的字符,这样通过key[i]就能知道word[i]中有哪些字符。在计算最大长度时,如果key[i] & key[j] == 0则说明二者没有共同的字符

 

Power of Four: https://leetcode.com/problems/power-of-four/

4^n = (2^2) ^ n = 2 ^(2n),所以如果一个数是4^n,则首先它的二进制只有一个1,并且这个1一定出现在0/1/3等奇数位,因为输入是32 bit,所以只要求 num & 0x5555,5555,看结果是不是0即可

以上是关于Bit Manipulation的主要内容,如果未能解决你的问题,请参考以下文章

Bit Manipulation

[leetcode]Bit Manipulation-476. Number Complement

Bit Manipulation

Java Bit Manipulation

位运算(Bit manipulation)

Leetcode Tags(13)Bit Manipulation