java - -1 除以 2 如何得到 -1?(按位运算>>)
问题描述
我很惊讶地看到 -1 除以 2 使用按位运算结果 -1。
我期待 0 被返回。
就像将 1 或 -1 除以 2 时,小数部分被删除,我们得到零。这可能与二的补码有关,但这只是我不完全理解的猜测和猜测。
有人可以解释一下吗?
-1 >> 1 = -1
-1 / 2 = 0
public class JavaFiddle
{
public static void main(String[] args)
{
System.out.println(-1 >> 1);
System.out.println(-1 / 2);
}
}
解决方案
Java 中的负数使用称为2 的补码的符号表示。如果我们假设有符号整数的大小是 8。你可以这样想 2 的补码
2 will be 00000010
1 will be 00000001
0 will be 00000000
-1 will be 11111111 (Count in reverse from max)
-2 will be 11111110
-3 will be 11111101
(实际上在java中的大小int
是4个字节)
>>
这是有符号的按位右移运算符。根据文档,它在正数的最左侧位置填充 0,对于负数,它将用 1 填充相同的位置。
这意味着将 -1 移动任意次数只给出 -1。
11111111 >> 1 = 11111111
这是因为负数除以 2的算术右移和除法含义的不等价性,并且在所有情况下都不应将右移视为相等
推荐阅读
- java - 问题是当程序执行 else 时,当密码和用户名为真时。关于它的任何想法?
- sql - Flink SQL:Outer Join with Group By 给出了意外的输出
- git - 纱线说“模式试图在同一个目的地拆包”
- javascript - 渲染时如何有效地截断其中包含html标签的文本?
- typescript - ESlint 不适用于带有打字稿的 .vue 文件
- php - 无法连接,无法与服务器建立连接
- javascript - 如何使用 Laravel 后端和 Vue 前端从数据库中获取数据?
- jquery - 从linkedin Sales Navigator 获取元数据
- angular - 如何动态填充 FormGroup?
- ios - 自动更新 App Store 订阅需要“恢复购买”?