zoukankan      html  css  js  c++  java
  • 181. Flip Bits【easy】

    181. Flip Bits【easy】

    Determine the number of bits required to flip if you want to convert integer n to integer m.

     Notice

    Both n and m are 32-bit integers.

    Example

    Given n = 31 (11111), m = 14 (01110), return 2.

    解法一:

     1 class Solution {
     2 public:
     3     /**
     4      *@param a, b: Two integer
     5      *return: An integer
     6      */
     7     int bitSwapRequired(int a, int b) {
     8         // write your code here
     9         int count = 0;  
    10         for (unsigned int c = a ^ b; c != 0; c = c >> 1) {
    11             count += c & 1;
    12         }
    13         return count;
    14     }
    15 };

    每次循环都会修改异或后的结果,循环退出条件就看该值是否为0即可,不用非要搞32位。

    解法二:

     1 class Solution {
     2 public:
     3     /**
     4      *@param a, b: Two integer
     5      *return: An integer
     6      */
     7 
     8     /*
     9     int num_of_1(int a){
    10         int num = 0;
    11         while (a){
    12             if (a >> 1){
    13                 num++;
    14             }
    15             a = a >> 1;
    16         }
    17         return num;
    18     }
    19     */
    20     //上面程序当a为负数时错误
    21     int num_of_1(int a){
    22         int num=0;
    23 
    24         for(int i=0;i<32;i++){
    25             if(a&(1<<i)){
    26                 num++;
    27             }
    28         }
    29 
    30         return num;
    31     }
    32 
    33     int bitSwapRequired(int a, int b) {
    34         // write your code here
    35         int XOR=a^b;
    36         return num_of_1(XOR);
    37     }
    38 };

    左移还是右移?对1左移可以避免对异或后的数右移带来的bug,或者对于异或后的结果仅仅右移32位也可以保证没有问题。

    参考自:http://blog.csdn.net/gao1440156051/article/details/50590427

    解法三:

     1 class Solution {
     2 public:
     3     /**
     4      *@param a, b: Two integer
     5      *return: An integer
     6      */
     7     int bitSwapRequired(int a, int b) {
     8         // write your code here
     9         int c = a ^ b;
    10         return getBitCount(c);
    11     }
    12 private:
    13     int getBitCount(int a) {
    14         int count = 0;
    15         while (a) {
    16             a = a & (a - 1);
    17             ++count;
    18         }
    19         return count;
    20     }
    21 };

    参考自:http://blog.csdn.net/shinanhualiu/article/details/49003797

    补充一下上面用到的位运算操作。

    n&(n-1)作用:将n的二进制表示中的最低位为1的改为0,先看一个简单的例子:
    n = 10100(二进制),则(n-1) = 10011 ==> n&(n-1) = 10000
    可以看到原本最低位为1的那位变为0。
    弄明白了n&(n-1)的作用,那它有哪些应用?

    1、 判断一个数是否是2的方幂
    n > 0 && ((n & (n - 1)) == 0 )

    解释((n & (n-1)) == 0):

    如果A&B==0,表示A与B的二进制形式没有在同一个位置都为1的时候。

    那么本题到底啥意思??

    不妨先看下n-1是什么意思。

       令:   n=1101011000(二进制,十进制也一样),则

           n-1=1101010111。

    n&(n-1)=1101010000

    由此可以得出,n和n-1的低位不一样,直到有个转折点,就是借位的那个点,从这个点开始的高位,n和n-1都一样,如果高位一样这就造成一个问题,就是n和n-1在相同的位上可能会有同一个1,从而使((n & (n-1)) != 0),如果想要

    ((n & (n-1)) == 0),则高位必须全为0,这样就没有相同的1。

    所以n是2的幂或0

    2. 求某一个数的二进制表示中1的个数,正如本题。

    参考自:http://blog.csdn.net/navyifanr/article/details/19496459

  • 相关阅读:
    ERP渠道管理添加验证和查询(二十二)
    SqlServer导入Excel数据
    WebApi帮助类
    SqlServer 递归查询树
    SqlServer查看表、存储过程、耗时查询、当前进程、开销较大的语句
    Excel上传找到错误数据类型
    索引Hint提示(INDEX Hint)
    SqlServer批量Sql一个表的数据导入到另一个数据
    SqlServer 游标
    JAVA运算符
  • 原文地址:https://www.cnblogs.com/abc-begin/p/7561983.html
Copyright © 2011-2022 走看看