首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bitshift :如何在Java中将十进制值转换为位移值

问bitshift :如何在Java中将十进制值转换为位移值
EN

Stack Overflow用户
提问于 2019-11-24 21:58:35
回答 1查看 194关注 0票数 1

我有一个REST API,它以十进制数的形式提供值,需要使用位移运算符的映射将它们转换为字符串:

代码语言:javascript
复制
EXCEPT DISABLED           1 << 0
EXCEPT MOTO               1 << 1
EXCEPT LOADING            1 << 2
EXCEPT COMMERCIAL         1 << 3

最大位移位可以达到28 (1<<28)。API提供了一个数字,例如262144,我将其转换为二进制(1000000000000000000),然后我推断移位是17。但是如何在Java中编写这样的函数呢?

EN

回答 1

Stack Overflow用户

发布于 2019-11-24 23:25:32

根据您用Kotlin编写的等效代码,我假设我正确理解了这个问题:

代码语言:javascript
复制
`val shift = Integer.toBinaryString(number).count { it == '0' }`,

它足以计算零,而不是尾随零。

我相信int对于你的范围来说已经足够了。因此,你的想法是:

代码语言:javascript
复制
int given = 262144;
String binaryString = Integer.toBinaryString(given);

都会起作用的。

代码语言:javascript
复制
int zeros = binaryString.length() - binaryString.replaceAll("0", "").length();

会给出0的个数,这就是你的答案。

如果是这样的话,实际上所有的零都在后面,似乎(尽管我不能从问题中确定)我们总是看到一个1后面跟着n个零。为了找到n,我们还可以这样做:

代码语言:javascript
复制
(int)Math.round(Math.log(given)/Math.log(2.0))

来找出零的个数。或者,如果我们继续使用字符串方法,就不需要显式地计算零。相反,

代码语言:javascript
复制
int zeros= binaryString.length()-1;

就足够了。

修改:以上所有内容都有一些不雅之处。我们得到一个整数,它被从0到28的任意整数左移了1。我们应该能够在没有实数操作或字符串的情况下撤销它,只需向右移动直到我们返回到1。因为我们的数字都> 0,所以我们可以使用>>>,尽管>> (或/=2)也可以。

如果给定的int为given,则下面的代码将在count中放置0的个数。

代码语言:javascript
复制
int temp = given;
int count = 0;
    while (temp>1){
        count++;
        temp=temp>>>1;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59018412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档