每天一道LeetCode-----计算整型数二进制中1的个数/返回二进制翻转后的结果
生活随笔
收集整理的這篇文章主要介紹了
每天一道LeetCode-----计算整型数二进制中1的个数/返回二进制翻转后的结果
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Reverse Bits
原題鏈接Reverse Bits
給定一個32位無符號整型數,將它的二進制逆序,返回結果
從字符串的角度觀察二進制逆序,只需要從兩端開始兩兩交換即可。當然,完全可以不將二進制轉為字符串,而是模擬字符串的逆序操作
代碼如下
class Solution { public:uint32_t reverseBits(uint32_t n) {uint32_t res = 0;uint32_t first = (1 << 31);uint32_t last = 1;int diff = 31;while(first > last){res |= ((first & n) >> diff);res |= ((last & n) << diff);diff -= 2;first >>= 1;last <<= 1;}return res;} };此外,利用std::bitset也可以解決本題
class Solution { public:uint32_t reverseBits(uint32_t n) {auto s = std::bitset<32>(n).to_string();std::reverse(s.begin(), s.end());return std::bitset<32>(s).to_ulong();} };Number of 1 Bits
原題鏈接Number of 1 Bits
計算給定32位無符號整型數的二進制中1的個數,方法比較多
雖然本題明確指出n是無符號數,但是大多數問題中n都是可正可負
第一種方法,一位一位計算
class Solution { public:int hammingWeight(uint32_t n) {int res = 0;/* 使用cnt作為循環次數的原因是n如果是負數,那么高位會全是1,導致無限循環 */int cnt = 32;while(cnt--){if(n & 1)++res;n >>= 1;}return res;} };如果n是負數,之所以會造成死循環是因為改變了n的值,導致右移時高位補1而不是補0
第二種方法,不移動n
class Solution { public:int hammingWeight(uint32_t n) {int res = 0;uint32_t flag = (1 << 32);while(flag){if(n & flag)++res;flag >>= 1;}return res;} };第三種方法,不移動n
class Solution { public:int hammingWeight(uint32_t n) {int res = 0;while(n){++res;n &= (n - 1);}return res;} };最后一種方法,利用std::bitset
class Solution { public:int hammingWeight(uint32_t n) {return std::bitset<32>(n).count();} };總結
以上是生活随笔為你收集整理的每天一道LeetCode-----计算整型数二进制中1的个数/返回二进制翻转后的结果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天一道LeetCode-----寻找给
- 下一篇: TCP/IP学习笔记(六)Nagle算法