【问题标题】:Bitwise operators and for loop位运算符和 for 循环
【发布时间】:2017-10-23 23:00:10
【问题描述】:

我正在尝试理解按位和移位运算符。我写了一个简单的代码来显示短类型的位。

class Shift {
    public static void main (String args[]) {
        short b = 16384;

        for (int t = 32768; t > 0; t = t / 2) {
            if ((b&t) != 0) System.out.print("1 ");
            else System.out.print ("0 ");
        }
        System.out.println();
        b = (short)(b + 2);
        for (long t = 2147483648L; t > 0; t = t / 2) {
            if ((b&t) != 0) System.out.print ("1 ");
            else System.out.print ("0 ");
        }
        System.out.println();
    }
}

输出是:

C:\>java Shift
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0

我将第二个用于与短(16 位)和长(64 位)的 AND,输出为 32 位。 我不明白为什么第二个 for 的输出是 32 位。 谢谢。

【问题讨论】:

  • 你是怎么想到2147483648L32768的?
  • 如果您想使用位,请不要使用像 327682147483648L 这样的十进制文字。请改用0x80001 << 14。并使用>><< 而不是/2*2。这将使意图更清晰

标签: java bitwise-operators


【解决方案1】:

您以long t = 2147483648L 开始循环,即2^31。因此,您的循环有 32 次迭代并打印 32 位。

如果您希望显示更多位,请以long t = 0x4000000000000000L; 开始循环(相当于以 01 开头并以 62 0s 结尾的二进制数)。

【讨论】:

  • 正确的起始数字是long t = Long.MIN_VALUE(实际上是最高位设置的数字)。
  • @TagirValeev 我同意 Long.MAX_VALUE 是错误的,但 Long.MIN_VALUE 也是错误的,因为 t > 0 从一开始就是错误的,t = t/2 也不起作用。跨度>
  • 是的,应该是for(long t = Long.MIN_VALUE; t != 0; t >>>= 1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
相关资源
最近更新 更多