我有一个REST API,它以十进制数的形式提供值,需要使用位移运算符的映射将它们转换为字符串:
EXCEPT DISABLED 1 << 0
EXCEPT MOTO 1 << 1
EXCEPT LOADING 1 << 2
EXCEPT COMMERCIAL 1 << 3最大位移位可以达到28 (1<<28)。API提供了一个数字,例如262144,我将其转换为二进制(1000000000000000000),然后我推断移位是17。但是如何在Java中编写这样的函数呢?
发布于 2019-11-24 23:25:32
根据您用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();会给出0的个数,这就是你的答案。
如果是这样的话,实际上所有的零都在后面,似乎(尽管我不能从问题中确定)我们总是看到一个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为given,则下面的代码将在count中放置0的个数。
int temp = given;
int count = 0;
while (temp>1){
count++;
temp=temp>>>1;
}https://stackoverflow.com/questions/59018412
复制相似问题