首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有人知道为什么我的java代码在使用n=n/2时不能正常工作,而n>>1是这样做的吗?

有人知道为什么我的java代码在使用n=n/2时不能正常工作,而n>>1是这样做的吗?
EN

Stack Overflow用户
提问于 2015-04-19 01:10:50
回答 2查看 220关注 0票数 1

这是leetcode(https://leetcode.com/problems/number-of-1-bits/)的一个问题。此方法用于计算这个数字在二进制中的1s。我尝试使用n=n/2,它不是通过所有的情况,而n=n>>1则是这样。有人知道为什么吗?

代码语言:javascript
复制
public class Numberof1Bits {

public static void main(String[] args) {
    System.out.println(new Numberof1Bits()
            .hammingWeight(0b11111111111111111111111111111111));
}

public int hammingWeight(int n) {
    int count = 0;
    if (n < 0)
        count++;
    for (int i = 0; i < 31; i++) {
        if ((n & 1) == 1)
            count++;
        n = n >> 1;// while this doesn't work when n=n/2;
    }
    return count;
}
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-19 01:15:45

你在使用未签名的ints。0xFFFFFFFF = -1-1 >> 1= -1。-1/2 = 0。对于任何具有最重要位集的数字,它都会失败。

如果是Java,则>>运算符执行符号扩展的按位右移.例如(为了清晰起见,我使用8位数字):

代码语言:javascript
复制
0b10111111 >> 1 => 0b11011111

同样的小数:

代码语言:javascript
复制
-65 >> 1 => -33

位被右移一个位置,最重要的位保持原样。我的示例数字(0b10111111)是-65小数点。如果你把它除以2,你就得到-32。是的,我们在翻译中损失了一点。/2执行算术除法,对于正数,它等价于>> 1 only

在支持无符号In和无符号右移的语言中,n/2应按预期工作。

在java中,由于>>是签名的,所以可以使用没有符号扩展的右移位的>>>,并可能使用更快的循环:

代码语言:javascript
复制
public int hammingWeight(int n) {
    int count = 0;
    while(n != 0) {
        if ((n & 1) != 0) {
            count++;
        }
        n = n >>> 1;
    }
    return count;
}
票数 1
EN

Stack Overflow用户

发布于 2015-04-19 01:59:45

>> 1将一个int除以二,但舍入是使用地板完成的,即向负无穷远舍入。相关的引用来自Java语言规范:

N个>> s的值是n个右移的s位位置,具有符号扩展.其结果值为下限(n/ 2^s)。

例如,

代码语言:javascript
复制
 20 >> 1 == 10
 15 >> 1 == 7   (7.5 is rounded down to 7)
-20 >> 1 == -10
-15 >> 1 == -8  (-7.5 is rounded down to -8) 

另一方面,对于/,舍入是向零方向进行的。这来自Java语言规范:

二进制/运算符执行除法,产生其操作数的商。左操作数是除数,右边操作数是除数. 整数除法转到0。

例如,

代码语言:javascript
复制
 20 / 2 == 10
 15 / 2 == 7    (7.5 is rounded down to 7)
-20 / 2 == -10
-15 / 2 == -7   (-7.5 is rounded UP to -7)

因此,对于负奇数整数nn /= 2n >>= 1; n++;相同。n++将完全更改设置位数的计算。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29724699

复制
相关文章

相似问题

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