java - 带括号的右移运算符
问题描述
我不明白为什么这段代码有区别:
byte b = (byte) (0xff >> 1);
(所以现在 b = 01111111),
这个代码:
byte b = (byte) 0xff;
b >>= 1;
(但现在 b = 11111111)。
在此先感谢您的帮助!
解决方案
在第一个代码中,(0xff >> 1)
是 255 >> 1,即 127。这是用整数计算的,然后将其转换为一个字节。127 作为一个字节是01111111
bin。
在第二个代码中,您从 开始(byte) 0xff
,即11111111
bin,它是 8 位中 -1 的二进制补码表示。(byte) 0xff
-1也是如此。
当您执行移位时,字节值-1
被提升为 int 值-1
。那是11111111 11111111 11111111 11111111
斌。
使用算术右移运算符将其右移一位,再次(-1) >> 1
给您11111111 11111111 11111111 11111111
,因为>>
负数上的运算符将位向右移动并用一而不是零填充左侧。
然后,由于您使用>>=
的是 ,结果将被转换回一个字节以存储在b
. 那只保留最后 8 位,即11111111
.
或者,如果您使用逻辑右移运算符,(-1) >>> 1
将给您01111111 11111111 11111111 11111111
二进制(一个零,后跟 31 个)。11111111
由于最后 8 位是相同的,所以当它被转换回一个字节时,它仍然会给你。
推荐阅读
- mysql - Drupal - PDOException:SQLSTATE [42S02]
- java - java- SDK 版本和 Vm 选项
- java - 为什么 outputStream 没有 inputStream 就不能工作?
- arrays - 从数组中删除重复的内容
- c++ - 重新加载矩阵的运算符,但不会更改以前的矩阵
- pyspark - 解析jsons pyspark的字符串
- postgresql - Express Vue 未创建关联,userId 为空
- java - 应为 '}' 但找到 eof
- javascript - Javascript 加载更多图像的数组 onclick。使用 Firebase
- css - 角 7 | mat-tab 活动 | 样式未反映