移位位值

时间:2013-10-01 06:23:32

标签: java

我最近开始学习自己的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;
  }

这是对的吗?我正确使用这种技术吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

  
    

是。
    一些内容填写30个字符的最小长度

  
好的,看起来这个笑话并不受欢迎,我期待人们喜欢这种讽刺的回答。哦,显然,SO中的人比我想象的更严重。

好吧,就像其他人提到的那样,你可以亲自检查一下!

正如您在代码注释中所写的那样,您已经正确地将您的评论(人类理解)转换为代码(机器理解)。

我怎么知道你是对的?那么,你可以查看在线资源:

  1. 适用于bit manipulation
  2. 或只是this Wikipedia entry
  3. 到目前为止,在咨询这些资源后,您的代码似乎符合您的意图。

    但是,你说,这是理论上的,我怎么知道经验我的答案是正确的?

    嗯,你可以这样做:

    1. 构建一些示例测试用例 在这种情况下,您可以使用十六进制数字,以便您可以轻松确认它(因为您可以看到每个位) 例如:尝试0xFFFFFFFF0x800000000xC0C0C0C0
    2. 手动找到正确答案 在这种情况下,请尝试自己移动钻头(使用笔和纸) 对于0xFFFFFFFF,这是一个32位数字,全1,当你向右移16位时,你会得到0x0000FFFF,这是一个32位数,只有最后16位只有1位。
      然后使用0xFF进行AND运算,这是一个32位数字,最后8位只有1。这将再次给你0xFF,因为只有最后8位这两个数字都有1位 重复其他示例。对于另一个示例,您应该获得0x000xC0
    3. 在这些输入上运行您的代码 要运行代码,可以使用称为Java编译器的东西(在大多数系统中通常称为javac) 如果你真的是初学者,你可以尝试像this这样的在线编译器 只需将代码放在那里并运行(使用输入/输出(I / O)管理,解释here
    4. 将输出与程序输出进行比较 通常,只有这一点才能让您确信您的代码是正确的 但有时会出现一些棘手的案例,这些案例会使代码不正确,即使它对某些小例子来说也是正确的。幸运的是,我们已经使用上面的理论答案检查了逻辑。
    5. 所以我希望有所帮助!

答案 1 :(得分:0)

首先让我欢迎你加入Java。不错的选择!

关于您的问题:如果这是正确与否取决于您的期望。

但首先,在学习Java时,你应该做两件事:

  • 获得像Eclipse这样的开发环境。
  • 了解如何使用Junit编写litte测试例程。这是一个JUnit Tutorial

我已经把你的代码嵌入到测试程序中,看看究竟发生了什么:

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)

顺便说一句:我猜结果并不像你预期的那样:-)因此找出>>>>>之间的区别。