按位运算符代码

Bitwise operators code

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

    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 = b+2;
        for (long t = 2147483648; t > 0; t = t/2) {
            if ((b&t) != 0) System.out.print ("1 ");
            else System.out.print ("0 ");
        }
        System.out.println();
    }
}

输出为:

C:\>javac Shift.java
Shift.java:11: error: integer number too large: 2147483648
                for (long t = 2147483648; t > 0; t = t/2) {
                              ^
1 error

我不明白为什么 long 类型不能保存值 2147483648。

感谢您的帮助。

感谢您的回答。 我更改了代码:

    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

为什么第二个"for"的输出是整数?

2147483648 是一个 int 文字,对于 int 来说太大了。对于 long 文字,将其更改为 2147483648L

根据JLS #3.10.1. Integer Literals

An integer literal is of type long if it is suffixed with an ASCII letter L or l (ell); otherwise it is of type int (§4.2.1).

因此

long t = 2147483648

应该是

long t = 2147483648L

其中 L 文字告诉编译器它是一个 long 值。否则默认编译器将其视为 int 值。