谁想到Java发明时应该签名的字节应该被取出并用芹菜的湿棒殴打直到他们哭:-)
你可以通过转换为int来做你想做的事情,并确保你永远不会将1移到顶部位,如下所示:
byte x = -1; int x2 = ((int)x) & 0xff; for(int i = 0; i < 8; i++) { x2 = (x2 >>> 1); System.out.println("X: " + x2); }
你的特殊问题是因为>>>正在转换为int来进行移位,然后你将它转换回一个字节,如下所示:
byte x = -1; int x2 = ((int)x) & 0xff; int x3; int x4 = x2; for(int i = 0; i < 8; i++) { x2 = (x2 >>> 1); System.out.println("X2: " + x2); x3 = (x >>> 1); x = (byte)x3; x4 = (x4 >>> 1); System.out.println("X: " + x3 + " " + x + " " + x4); }
哪个输出:
X2: 127 X: 2147483647 -1 127 X2: 63 X: 2147483647 -1 63 X2: 31 X: 2147483647 -1 31 X2: 15 X: 2147483647 -1 15 X2: 7 X: 2147483647 -1 7 X2: 3 X: 2147483647 -1 3 X2: 1 X: 2147483647 -1 1 X2: 0 X: 2147483647 -1 0
您可以清楚地看到x和x3不起作用(即使x3正确移位,将其转换回x中的字节再次将其设置为-1).x4工作得很好.
谁想到Java发明时应该签名的字节应该被取出并用芹菜的湿棒殴打直到他们哭:-)
你可以通过转换为int来做你想做的事情,并确保你永远不会将1移到顶部位,如下所示:
byte x = -1; int x2 = ((int)x) & 0xff; for(int i = 0; i < 8; i++) { x2 = (x2 >>> 1); System.out.println("X: " + x2); }
你的特殊问题是因为>>>正在转换为int来进行移位,然后你将它转换回一个字节,如下所示:
byte x = -1; int x2 = ((int)x) & 0xff; int x3; int x4 = x2; for(int i = 0; i < 8; i++) { x2 = (x2 >>> 1); System.out.println("X2: " + x2); x3 = (x >>> 1); x = (byte)x3; x4 = (x4 >>> 1); System.out.println("X: " + x3 + " " + x + " " + x4); }
哪个输出:
X2: 127 X: 2147483647 -1 127 X2: 63 X: 2147483647 -1 63 X2: 31 X: 2147483647 -1 31 X2: 15 X: 2147483647 -1 15 X2: 7 X: 2147483647 -1 7 X2: 3 X: 2147483647 -1 3 X2: 1 X: 2147483647 -1 1 X2: 0 X: 2147483647 -1 0
您可以清楚地看到x和x3不起作用(即使x3正确移位,将其转换回x中的字节再次将其设置为-1).x4工作得很好.
请记住:
按位运算的操作数总是被提升为至少一个int!
演员阵容总是涉及签名延期.
所以当你这样做(x >>> n)时,即使你将x定义为一个字节,出于移位的目的,它也会首先转换为int.如果被转换的字节是负数,那么所有添加到"int"的"额外位"(因此,最终的int的最左边24位)将被设置为1.或者换一种方式,如果是原始的byte是-1,你实际上移位的是-1作为int,即32位数,所有32位都设置为1.将此右移1-8位仍然会导致底部8位全部设置为1,因此当你转回一个字节时,你得到一个字节,其中所有8位设置为1,或者换句话说,字节值为-1.