位移位:如何在Java中将十进制值转换为位移位值
我有一个REST API,它提供十进制数形式的值,需要使用位移位运算符映射将它们转换为字符串:位移位:如何在Java中将十进制值转换为位移位值,java,binary,bit,bit-shift,Java,Binary,Bit,Bit Shift,我有一个REST API,它提供十进制数形式的值,需要使用位移位运算符映射将它们转换为字符串: EXCEPT DISABLED 1 << 0 EXCEPT MOTO 1 << 1 EXCEPT LOADING 1 << 2 EXCEPT COMMERCIAL 1 << 3 除了DISABLED 1根据您在Kotlin中的等效代码,我假设我正确理解了问题: `va
EXCEPT DISABLED 1 << 0
EXCEPT MOTO 1 << 1
EXCEPT LOADING 1 << 2
EXCEPT COMMERCIAL 1 << 3
除了DISABLED 1根据您在Kotlin中的等效代码,我假设我正确理解了问题:
`val shift = Integer.toBinaryString(number).count { it == '0' }`,
它足以计数零,而不是尾随的零
我相信int足以满足您的范围。因此,你的想法是:
int given = 262144;
String binaryString = Integer.toBinaryString(given);
会有用的
int zeros = binaryString.length() - binaryString.replaceAll("0", "").length();
将给您零的数目,这是您的答案
如果是这样的话,而且所有的零都是尾随的,那么看起来很有可能(尽管我不能从问题中确定),我们总是在看一个1后面跟着n个零。要找到n,我们还可以执行以下操作:
(int)Math.round(Math.log(given)/Math.log(2.0))
找到零的数目。或者,如果我们继续使用字符串方法,就不需要显式地计算零。而是
int zeros= binaryString.length()-1;
就够了
修订:
以上这些都有点不雅。我们得到了一个整数,它由0到28的任意整数左移1。我们应该能够在没有实数运算或字符串的情况下撤销它,只需向右移动,直到回到1。因为我们的数字都>0,所以我们可以使用>>>,不过>>(或/=2)也可以
如果给定的int是给定的
,则以下内容将零的数量放入计数中
int temp = given;
int count = 0;
while (temp>1){
count++;
temp=temp>>>1;
}
根据您在Kotlin中的等效代码,我假设我正确理解了问题:
`val shift = Integer.toBinaryString(number).count { it == '0' }`,
它足以计数零,而不是尾随的零
我相信int足以满足您的范围。因此,你的想法是:
int given = 262144;
String binaryString = Integer.toBinaryString(given);
会有用的
int zeros = binaryString.length() - binaryString.replaceAll("0", "").length();
将给您零的数目,这是您的答案
如果是这样的话,而且所有的零都是尾随的,那么看起来很有可能(尽管我不能从问题中确定),我们总是在看一个1后面跟着n个零。要找到n,我们还可以执行以下操作:
(int)Math.round(Math.log(given)/Math.log(2.0))
找到零的数目。或者,如果我们继续使用字符串方法,就不需要显式地计算零。而是
int zeros= binaryString.length()-1;
就够了
修订:
以上这些都有点不雅。我们得到了一个整数,它由0到28的任意整数左移1。我们应该能够在没有实数运算或字符串的情况下撤销它,只需向右移动,直到回到1。因为我们的数字都>0,所以我们可以使用>>>,不过>>(或/=2)也可以
如果给定的int是给定的
,则以下内容将零的数量放入计数中
int temp = given;
int count = 0;
while (temp>1){
count++;
temp=temp>>>1;
}
我有一个想法,使用Integer.tobinarysting()转换为字符串位表示,然后计算零的数量,但这似乎是一个愚蠢的解决方案。我想知道是否有更好的方法。它总是一个1后面跟着那么多个0,还是看起来像11000,比如说?如果是前者,我之前的评论+长度会给你带来变化。如果不是的话,我可以写一些东西,如果有的话,在结尾计算0。如果是前者,那么log base 2也应该可以工作,所以我想我也有同样愚蠢的解决方案:)。可能有更圆滑的东西。另外,在你的例子中,我想我遗漏了一些东西,因为我数了18个零。(int)Math.round(Math.log(number)/Math.log(2.0))应该这样做。假设它总是一个1后跟n个0。如果它看起来像11后跟n个零,这就不行了。我有一个想法,使用Integer.tobinarysting()转换为字符串位表示,然后计算零的数量,但这似乎是一个愚蠢的解决方案。我想知道是否有更好的方法。它总是一个1后面跟着那么多个0,还是看起来像11000,比如说?如果是前者,我之前的评论+长度会给你带来变化。如果不是的话,我可以写一些东西,如果有的话,在结尾计算0。如果是前者,那么log base 2也应该可以工作,所以我想我也有同样愚蠢的解决方案:)。可能有更圆滑的东西。另外,在你的例子中,我想我遗漏了一些东西,因为我数了18个零。(int)Math.round(Math.log(number)/Math.log(2.0))应该这样做。假设它总是一个1后跟n个0。如果它看起来像11后面跟着n个零,这就不行了。