• 给定两个正整数(二进制形式表示)A和B,问把A变为B需要改变多少位(bit)?也就是说,整数A和B的二进制表示中有多少位是不同的?


    解法一:举例说明,为了减少复杂度,就使用八位二进制吧。设 A = 0010 1011, B = 0110 0101.
    1. C = A & B = 0010 0001;
    2. D = A | B = 0110 1111;
    3. E = C ^ D = 0100 1110;
    4. 结果E中有4个1,那么也就是说将A变成B,需要改变4位(bit)。
    至于如何判断E的二进制表示中有几个1,可以采用快速移位与方法。
    算法原理如下:
    1. A & B,得到的结果C中的1的位表明了A和B中相同的位都是1的位;
    2. A | B, 得到的结果D中的1的位表明了A和B在该位至少有一个为1的位,包含了A 与 B 都是1的位数,
    经过前两步的位运算,,C 中1的位表明了A 和 B在该位都是1,D中为0的位表明了A 和 B 在该位都是0 ,所以进行第三步。
    3. C ^ D,E 中为1的位表明了A 和 B不同的位。

    代码:

    #include<iostream>
    using namespace std;
    int getNum(int n)
    {
        if(n==0) return 0;
        int count=0;
        while(n)
        {
            n&=(n-1);
            count++;
        }
        return count;
    } 
    int main()
    {
        int A=43,B=101;
        int C=A&B;
        int D=A|B;
        int E=C^D;
        cout<<getNum(E)<<endl;
        system("pause");
        return 0;
    }

    解法二:

    思路:对于给定的两个数,从最低位开始扫描,分别找到A和B的第一个“1”出现的位置,n1和n2
    1. n1==n2,将n1(n2)位置0,继续往高位找;
    2. n1<n2, 说明A的n1位为1,但B的n1位为0,num++;将A的n1位置0,继续寻找A的下一个1的位置;
    3. n1>n2, 同2)反之。

    代码:

    int count(int a, int b)
    {
        unsigned int n1,n2,num=0;
        n1=a-(a&(a-1));
        n2=b-(b&(b-1));
        while((n1!=0)&&(n2!=0))
        {
            if(n1==n2)
            {
                a&=~n1;
                b&=~n2;
                n1=a-(a&(a-1));
                n2=b-(b&(b-1));
            }
            else
            {
                num++;
                if(n1<n2)
                {
                    a&=(~n1);
                    n1=a-(a&(a-1));
                }
                else
                {
                    b&=(~n2);
                    n2=b-(b&(b-1));
                }
            }
        }
        while(n1!=0)
        {
            num++;
            a&=(~n1);
            n1=a-(a&(a-1));
        }
        while(n2!=0)
        {
            num++;
            b&=(~n2);
            n2=b-(b&(b-1));
        }
        return num;
    }

    复杂性分析:始终在追踪“1”,因此复杂性为O(V(A|B)),V(A|B)为A|B中的“1”的个数。。

  • 相关阅读:
    java selenium (九) 常见web UI 元素操作 及API使用
    java selenium (六) XPath 定位
    java selenium (八) Selenium IDE 用法
    java selenium (五) 元素定位大全
    一个使用CSocket类的网络通信实例
    揭开链接器的面纱(中)
    揭开连接器的面纱(上)
    深入理解程序的结构
    调试利器GDB(下)
    调试利器GDB(上)
  • 原文地址:https://www.cnblogs.com/sooner/p/2994940.html
Copyright © 2020-2023  润新知