我正在尝试左右移动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;
}
答案 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。