0

我最近开始自学 Java,尤其是在某个部分遇到了麻烦。今天我阅读了移位位值,我想知道我所做的是否正确?

我想将一个值向右移动 16 位,然后通过将值与 8 位掩码相加来清除高 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;
  }

这个对吗?我是否正确使用了这种技术?

谢谢!

4

2 回答 2

4

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

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

好吧,就像其他人提到的那样,您实际上可以自己检查!

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

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

  1. 用于位操作
  2. 或者只是这个维基百科条目

到目前为止,在查阅了这些资源之后,您的代码似乎符合您的意图。

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

好吧,你可以这样做:

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

所以我希望这会有所帮助!

于 2013-10-01T06:28:13.417 回答
0

首先让我欢迎您使用 Java。好的选择!

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

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

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

我已经获取了您的代码并将其嵌入到测试例程中,以查看实际发生的情况:

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)

顺便说一句:我猜结果并不像你所期望的那样:-) 因为找出>>和的区别>>>

于 2013-10-01T07:03:09.497 回答