<<
>>
>>>
我知道这几个是以二进制来位移的
但是出现带符号的。我有点乱。
有人会的话请帖上对比的二进制格式的。
不知道的请不要盖楼。
讲的好的我加分。

解决方案 »

  1.   

    public class BitOperator {    public static void main(String[] args) {        System.out.println("\n按位左移");
            output("123", 123);
            output("123 << 2", 123 << 2);        System.out.println("\n按位有符号右移");
            output("123", 123);
            output("123 >> 2", 123 >> 2);        System.out.println("\n按位有符号右移,右移时高位补充符号位");
            output("-123", -123);
            output("-123 >> 2", -123 >> 2);        System.out.println("\n按位无符号右移");
            output("123", 123);
            output("123 >>> 2", 123 >>> 2);        System.out.println("\n按位无符号右移,右移时高位补 0");
            output("-123", -123);
            output("-123 >>> 2", -123 >>> 2);
        }    private static void output(String prompt, int result) {
            System.out.printf("%10s = %-10d  %s%n", prompt, result, toBit(result));
        }    public static String toBit(int num) {
            char[] chs = new char[39];
            for (int i = 0, k = 0; i < Integer.SIZE; i++) {
                chs[k++] = (char)('0'+ ((num >>> Integer.SIZE - i - 1) & 1));
                if ((i & 3) == 3 && k < chs.length) {
                    chs[k++] = ' ';
                }
            }
            return new String(chs);
        }
    }
    按位左移
           123 = 123         0000 0000 0000 0000 0000 0000 0111 1011
      123 << 2 = 492         0000 0000 0000 0000 0000 0001 1110 1100按位有符号右移
           123 = 123         0000 0000 0000 0000 0000 0000 0111 1011
      123 >> 2 = 30          0000 0000 0000 0000 0000 0000 0001 1110按位有符号右移,右移时高位补充符号位
          -123 = -123        1111 1111 1111 1111 1111 1111 1000 0101
     -123 >> 2 = -31         1111 1111 1111 1111 1111 1111 1110 0001按位无符号右移
           123 = 123         0000 0000 0000 0000 0000 0000 0111 1011
     123 >>> 2 = 30          0000 0000 0000 0000 0000 0000 0001 1110按位无符号右移,右移时高位补 0
          -123 = -123        1111 1111 1111 1111 1111 1111 1000 0101
    -123 >>> 2 = 1073741793  0011 1111 1111 1111 1111 1111 1110 0001
      

  2.   

    1:先求出 1 的 32 位补码:0000 0000 0000 0000 0000 0000 0000 0001
    2:再将各位取反(0 变 1,1 变 0):1111 1111 1111 1111 1111 1111 1111 1110
    3:再加上 1 即是 -1 的 32 位补码:1111 1111 1111 1111 1111 1111 1111 1111
    非常感谢。
    呵呵。逮到个大牛就多问问把。
    在java中:
    char c='中';//编译、运行都正确  因为char是2个字节的,中文字符是两个字节的,所以正确
    char c='ab';//这里为什么编译就出错了?不是说英文是1个字节的吗?
      

  3.   

    java用unicode编码,可以放中文,可以放英文。
    ‘中’是一个字符,在unicode编码占两个字节。
    ‘a’  是一个字符,在unicode编码占一个字节。
    ‘ab’ 是两个字符了,是字符串,不可以。 因为char只能是单字符。