Java 在一个数的二进制表示中计算一个数

Java 在一个数的二进制表示中计算一个数,java,Java,可能重复: 我想知道一个数字的二进制表示中有多少个1,我有2个逻辑 现在第二个逻辑是继续用1,2,4,8,32迭代屏蔽数字,并检查结果是否为1,2,4,8。。。。。我没有得到这个循环的结束条件 您的最终条件应该是跟踪您所处位的大小;如果它大于您完成的原始数字(从现在起将只获得0) 哦,既然您没有指定语言,这里有一个Ruby解决方案:) 看起来像c/c++/c#,如果是这样的话,那么您有移位。。只需从0循环到N-1位,并使用sum+=(值>>i)&1 Ie:您总是检查最后/最右边的位,但每次迭

可能重复:

我想知道一个数字的二进制表示中有多少个1,我有2个逻辑

  • 现在第二个逻辑是继续用1,2,4,8,32迭代屏蔽数字,并检查结果是否为1,2,4,8。。。。。我没有得到这个循环的结束条件


  • 您的最终条件应该是跟踪您所处位的大小;如果它大于您完成的原始数字(从现在起将只获得0)

    哦,既然您没有指定语言,这里有一个Ruby解决方案:)

    看起来像c/c++/c#,如果是这样的话,那么您有移位。。只需从0循环到N-1位,并使用
    sum+=(值>>i)&1

    Ie:您总是检查最后/最右边的位,但每次迭代都将数字的二进制表示形式向右移动,直到没有更多的位可检查为止


    另外,考虑有符号/无符号和任何整数格式。但是您没有在问题中说明应该如何处理。

    我们可以利用溢出来处理您的循环:

    int count = 0;
    int number = 37;
    int mask = 1;
    
    while(mask!=0)
    {
        int d = number & mask;
        if(d != 0)
            count++;
        /* Double mask until we overflow, which will result in mask = 0... */
        mask = mask << 1;
        str = str+ d;
    }
    
    int count=0;
    整数=37;
    int-mask=1;
    while(掩码!=0)
    {
    int d=数字和掩码;
    如果(d!=0)
    计数++;
    /*双重掩码直到溢出,这将导致掩码=0*/
    
    mask=mask比前面的任何答案都快: (与1位的数量而不是总位的数量成比例)


    使用BigInteger类怎么样

    public void function(int checkedNumber) {
        BigInteger val = new BigInteger(String.valueOf(checkedNumber));
        val = val.abs();
        int count = val.bitCount();
        String binaryString = val.toString(2);
    
        System.out.println("count = " + count);
        System.out.println("bin = " + binaryString);
    }
    
    函数(42)的结果如下

    count = 3
    bin = 101010
    
    使用JavaAPI(Java5或更高版本)


    注:上述java方法基于一种常用的计数方法,即构建一个包含每个字节答案的查找表,然后将数字拆分为四个字节并求和。这需要四次查找,速度相当快。您可以编写一个手动计算答案(可能使用上述程序),然后可以编写如下函数:

    private static final int[] BYTE_TOTALS = /* ... generate this ... */;
    
    public static int countOneBits(int value) {
        return BYTE_TOTALS[value        & 0xFF] +
               BYTE_TOTALS[value >>>  8 & 0xFF] +
               BYTE_TOTALS[value >>> 16 & 0xFF] +
               BYTE_TOTALS[value >>> 24 & 0xFF];
    }
    

    希望这有帮助!

    有多种方法可以快速完成这项工作


    您关心哪种语言?添加了java作为原始postnice解决方案的标记,但如何获得N的值?它的
    sizeof(type)
    *8为Int32设置32我不确定此函数是否在java@akshayxyz我想是的,我的谷歌支票也这么说。考虑一下SIZEOF(int)是32,我想检查的数字是2(10)。。在这种情况下,我只关心最右边的2位。因此会有不必要的迭代。对不起,我不懂ruby代码,但人们可能会欣赏它-除了猴子补丁;)代码示例中的
    int
    应该告诉您他使用的是有符号整数,这意味着幅值检查不起作用。另外,它是你应该告诉你Ruby代码不实用。@ AkSayyxz如果你不知道,那么我认为你面试失败了。)PrRez:我不知道它是什么语言。如果是C++或java,它就不会有<代码>溢出异常< /C>。如果是C代码,它需要一个<代码>检查< /Cord>块来获得例外。抱歉OverflowE。除此之外,我把我的Java和我的C#划掉了。上面的版本在Java中应该可以正常工作,并且不需要你知道迭代多少位,等等=)不,因为它可以优化为0!),但是如果你修复了错误,它的性能很可能会更好(鸭子)stefan:只要
    no
    是一个常数,循环就可以被优化掉。@stefan——优化掉0很有趣,但是如果你把no改为一个参数,它肯定会表现得更好,因为它与1位的数量成正比,而不是像其他解决方案那样与位数成正比。换句话说,如果no=1024,则e循环将只运行一次——有意义吗?
    public void function(int checkedNumber) {
        BigInteger val = new BigInteger(String.valueOf(checkedNumber));
        val = val.abs();
        int count = val.bitCount();
        String binaryString = val.toString(2);
    
        System.out.println("count = " + count);
        System.out.println("bin = " + binaryString);
    }
    
    count = 3
    bin = 101010
    
    Integer.bitCount(int);
    Long.bitCount(long);
    
    private static final int[] BYTE_TOTALS = /* ... generate this ... */;
    
    public static int countOneBits(int value) {
        return BYTE_TOTALS[value        & 0xFF] +
               BYTE_TOTALS[value >>>  8 & 0xFF] +
               BYTE_TOTALS[value >>> 16 & 0xFF] +
               BYTE_TOTALS[value >>> 24 & 0xFF];
    }
    
    int no =1234;
    int tmp =0;
    tmp = no - ((no >> 1) & 033333333333) - ((no >> 2) & 011111111111);
    System.out.println( ((tmp + (tmp >> 3)) & 030707070707) % 63);