解决问题后出现:
我的解决方法是:
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放置,它似乎无法移动。
为什么给我不同的价值?
这应该是一个相当容易的修复。return (~0>>>32)&~n;
:零被解释为int
类型。要告诉程序类型为long
,请编写以下代码:return (~0L>>>32)&~n;
在相关说明中,对短裤和字节的处理类似。
byte b =-16; // 1111000
b = (byte)(b>>>1);
System.out.println(b); //prints -8 and not 120
ANDing
和0xFF
解决了问题
b = -16;
b = (byte)((b&0xFF)>>1);
System.out.println(b); // prints 120 as expected.
原因是b首先转换为int然后移位。
换句话说,如果n
很长,为什么不只使用~n
来翻转位,因为这就是全部了?