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个逻辑
您的最终条件应该是跟踪您所处位的大小;如果它大于您完成的原始数字(从现在起将只获得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);