Java shift运算符在使用预保存值时与直接值时不一样

问题描述 投票:0回答:2

解决问题后出现:

https://www.hackerrank.com/challenges/flipping-bits/problem?h_l=interview&playlist_slugs%5B%5D%5B%5D=interview-preparation-kit&playlist_slugs%5B%5D%5B%5D=miscellaneous

我的解决方法是:

static long flippingBits(long n) {
    long l=0;                       //Have to pre-declare 0, Why?
    return (~l>>>32)&~n;
}

但是我想做的是直接在return语句中使用0,而不是在“ long l”中之前声明它,例如:

static long flippingBits(long n) {
    return (~0>>>32)&~n;            //Using 0 directly don't works.
}

我也尝试使用括号,但相同。经过测试后,如果我直接将0放置,它似乎无法移动。

为什么给我不同的价值?

java bit-manipulation bitwise-operators bit-shift
2个回答
1
投票

这应该是一个相当容易的修复。return (~0>>>32)&~n;:零被解释为int类型。要告诉程序类型为long,请编写以下代码:return (~0L>>>32)&~n;


0
投票

在相关说明中,对短裤和字节的处理类似。

byte b =-16; // 1111000
b = (byte)(b>>>1);
System.out.println(b); //prints -8 and not 120

ANDing0xFF解决了问题

b = -16;
b = (byte)((b&0xFF)>>1);
System.out.println(b); // prints 120 as expected.

原因是b首先转换为int然后移位。

换句话说,如果n很长,为什么不只使用~n来翻转位,因为这就是全部了?

© www.soinside.com 2019 - 2024. All rights reserved.