在Java中使用Left和Right shift实现ASCII值

时间:2015-05-11 09:48:07

标签: java

我正在尝试左右移动ASCII值,但我的方法(如下所示)给出0的正确值,但是它必须显示1,它给出了这样的输出:

the values of asciiValue in getLeastbit function 98 shift 0
temp value0
the values of asciiValue in getLeastbit function 97 shift -2147483648
temp value1

因为我无法解决问题是什么问题。

int getleastbit(int asciiValue) {
    int temp;
    temp = asciiValue << 31;
    //System.out.println("temp value for checking"+temp);
    System.out.println("the values of asciiValue in getLeastbit function "+asciiValue+" shift "+temp);
    temp = temp >>> 31;
    System.out.println("temp value"+temp);
    return temp;
}

3 个答案:

答案 0 :(得分:1)

输出正确。 -2147483648是32位二进制文​​件中的1000 0000 0000 0000 0000 0000 0000 0000(Java的int格式)。在MSB(最高有效位)的位置最终得到LSB(最低有效位)。

答案 1 :(得分:0)

在转移31位(<<>>)时,我们留下:

asciiValue << 31 0000 0000 0000 0000 0000 0000 0000 0000

但是当我们使用无符号右移时:

asciivalue >>> 31
-2147483648 is 1000 0000 0000 0000 0000 0000 0000 0000

旁注当您使用<<>>运算符移动整数且移位距离大于或等于32时,您需要移位距离mod 32.这意味着你屏蔽了移位距离的低位5位以外的所有内容。

例如(i >> 32) == i,对于每个整数i。您可能希望它将整个数字向右移动,正输入返回0,负输入返回-1,但它没有;它只返回i,因为(i << (32 & 0x1f)) == (i << 0) == i

    public static void main(String[] args) {
        int i= 40;
        System.out.println(i>>31);
        System.out.println(i>>32);
        System.out.println(i<<31);
        System.out.println(i<<32);
    }

输出:

0 40 0 40

答案 2 :(得分:0)

你做左移31个字节。如您所知,左移操作基本上使您为每次换档操作输入的数字加倍。例如。 1&lt;&lt; 1 = 2,2 <&lt; 1 1 = 4等。您可以执行一个小程序来测试它给出97为负值的原因:

int a = 97; for (int i = 0; i < 31; i++) { a = a << 1; System.out.println(a); }

您将看到(某些)以下值:194,388,776,...,1627389952,-1040187392,-2080374784,134217728,...,-2147483648。由于您的数字是97,我们知道31个移位操作将生成一个大于Integer.MAX_VALUE的数字,因此会发生溢出。在这种情况下,移位操作将表现得像预期的那样,丢弃最高有效字节并添加新的0作为最低有效字节。由于你做了31次转换并且你的数字是奇数,你将得到1后跟31个零,这是一个负整数值。因此,如果您希望查看最后一个字节是否为0或1,如果您有此负值,则始终为1,否则为原始数字的最后一个字节为0。