当前位置: 首页 > 面试题库 >

Java位操作

水飞掣
2023-03-14
问题内容
byte x = -1;
for(int i = 0; i < 8; i++)
{
    x = (byte) (x >>> 1);
    System.out.println("X: " + x);
}

据我了解,java将数据存储在二进制补码中,表示-1 = 11111111(根据Wikipedia)。

同样,从java docs中:“位模式由左侧操作数给出,要移位的位置数由右侧操作数给出。无符号的右移运算符“ >>>”将零移位到最左边位置,而“

”之后的最左侧位置取决于符号扩展名。”

这意味着>>>每次都会将0移到最左侧。所以我希望这段代码是

迭代:x的位表示

0:11111111

1:01111111

2:00111111

3:00011111

…等等

但是,我的输出始终为X:-1,这意味着(我想)>>>将符号位放在最左侧。所以我然后尝试>>,并且得到相同的结果。

这是怎么回事?我希望我的输出是:X:-1,x:127,x:63等。


问题答案:

谁想到在发明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完美运行。



 类似资料:
  • 问题内容: 为什么要 我们有00000000000000000000000000000000000001 但是如果 我们有11111111111111111111111111111111(-1) 但不是00000000000000000000000000000000000000? 问题答案: 从JLS的15.19节开始: 如果左侧操作数的提升类型为int,则仅 将右侧操作数的最低5位用作移位距离

  • 本文向大家介绍java<<、>>、>>>移位操作方法,包括了java<<、>>、>>>移位操作方法的使用技巧和注意事项,需要的朋友参考一下 <<,有符号左移位,将运算数的二进制整体左移指定位数,低位用0补齐。 以上是正整数,运算结果如下。 接下来看看将负数进行左移2位操作是什么情况,运算结果如下。 为什么会-10的二进制会出现这么多的1呢?仔细数一下刚好有32位。首先需要了解的是Java负数存储是

  • 这个代码的大O是什么?我知道除了递归部分,所有的线都是O(1)。我不确定递归的大O是什么,我有一种感觉,它仍然是O(1),因为我们没有比O(1)更差的线,但通常递归是O(n)。 代码: 编辑:顺便说一句,这不是家庭作业,而是为面试做准备。

  • 我目前正在处理Java 8中使用Lambdas进行按位操作的循环转换问题。 给定一组复杂的条目,循环需要遍历所有条目并对它们调用给定的方法(方法返回布尔值)。之后,返回结果。 谢谢!

  • 通过np.bitwise_and()函数对输入数组中的整数的二进制表示的相应位执行位与运算。 例子 输出如下: 13 和 17 的二进制形式: 0b1101 0b10001 13 和 17 的位与: 1 你可以使用下表验证此输出。 考虑下面的位与真值表。 通过np.bitwise_or()函数对输入数组中的整数的二进制表示的相应位执行位或运算。 import numpy as np a,b = 1

  • 求子集[M]