我最近开始学习自己的java,特别是我遇到了麻烦。今天我读到了改变位值,我想知道我在做什么是正确的?
我希望将一个值向右移16位,然后通过使用8位掩码为1来清除高24位。这是我的代码的一部分:
int shift(){
point = point >> 16; //shifts the value to the right by 16 bits
point = point & 0xFF; //clear the upper 24 bits
return point;
}
这是对的吗?我正确使用这种技术吗?
谢谢!
答案 0 :(得分:4)
好的,看起来这个笑话并不受欢迎,我期待人们喜欢这种讽刺的回答。哦,显然,SO中的人比我想象的更严重。是。
一些内容填写30个字符的最小长度
好吧,就像其他人提到的那样,你可以亲自检查一下!
正如您在代码注释中所写的那样,您已经正确地将您的评论(人类理解)转换为代码(机器理解)。
我怎么知道你是对的?那么,你可以查看在线资源:
到目前为止,在咨询这些资源后,您的代码似乎符合您的意图。
但是,你说,这是理论上的,我怎么知道经验我的答案是正确的?
嗯,你可以这样做:
0xFFFFFFFF
,0x80000000
,0xC0C0C0C0
。0xFFFFFFFF
,这是一个32位数字,全1,当你向右移16位时,你会得到0x0000FFFF
,这是一个32位数,只有最后16位只有1位。0xFF
进行AND运算,这是一个32位数字,最后8位只有1。这将再次给你0xFF
,因为只有最后8位这两个数字都有1位
重复其他示例。对于另一个示例,您应该获得0x00
和0xC0
。所以我希望有所帮助!
答案 1 :(得分:0)
首先让我欢迎你加入Java。不错的选择!
关于您的问题:如果这是正确与否取决于您的期望。
但首先,在学习Java时,你应该做两件事:
我已经把你的代码嵌入到测试程序中,看看究竟发生了什么:
public class Stackoverflow extends TestCase {
@Test
public final void test() throws IOException {
testNprint(1234);
testNprint(-1234);
testNprint(0);
testNprint(255);
testNprint(256);
testNprint(Integer.MAX_VALUE);
testNprint(Integer.MIN_VALUE);
}
private void testNprint(int point) {
System.out.printf("int: %1$d (0x%1$X) -> shifted: %2$d (0x%2$X)\n",
point, shift(point));
}
private int shift(int point) {
point = point >> 16; //shifts the value to the right by 16 bits
point = point & 0xFF; //clear the upper 24 bits
return point;
}
}
这是结果。现在您可以回答您的问题:数字是否符合预期?
int: 1234 (0x4D2) -> shifted: 0 (0x0)
int: -1234 (0xFFFFFB2E) -> shifted: 255 (0xFF)
int: 0 (0x0) -> shifted: 0 (0x0)
int: 255 (0xFF) -> shifted: 0 (0x0)
int: 256 (0x100) -> shifted: 0 (0x0)
int: 2147483647 (0x7FFFFFFF) -> shifted: 255 (0xFF)
int: -2147483648 (0x80000000) -> shifted: 0 (0x0)
顺便说一句:我猜结果并不像你预期的那样:-)因此找出>>
和>>>
之间的区别。