社区
Java SE
帖子详情
system.out.println(-8>>>2),输出1073741822。求解释。谢谢。
magic_kid_2010
2012-10-21 07:18:07
system.out.println(-8>>>2),输出1073741822。求解释。谢谢。
...全文
500
6
打赏
收藏
system.out.println(-8>>>2),输出1073741822。求解释。谢谢。
system.out.println(-8>>>2),输出1073741822。求解释。谢谢。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Utopia
2012-10-22
打赏
举报
回复
-8: 1111 1111 1111 1111 1111 1111 1111 1000 或者0xfffffff8
无符号右移两位: 0011 1111 1111 1111 1111 1111 1111 1110 或者0x3ffffffe
licip
2012-10-21
打赏
举报
回复
你把-8转化为32位的二进制数,然后无符号右移2位,再把它计算出来结果为:1073741822
liuhuabai100
2012-10-21
打赏
举报
回复
在JAVA中 int是一个含符号的变量
0x0~0x7FFFFFFF为正数,0x80000000~0xFFFFFFFF为负数。
其中0xFFFFFFFF表示的是-1,-8是用0xFFFFFFF8表示的。
把这个数无符号右移2位,就是0x3FFFFFFE;
把这个数有符号右移2位,就是0xFFFFFFFE;
(用计算器把它转换一下吧?)
ldq67123
2012-10-21
打赏
举报
回复
[Quote=引用 2 楼 的回复:]
引用 1 楼 的回复:
你把-8转化为32位的二进制数,然后无符号右移2位,再把它计算出来结果为:1073741822
-8的二进制表示为:0000 0000 0000 0000 0000 0000 0000 1000?
右移两位为0000 0000 0000 0000 0000 0000 0000 0010,不是等于-2了吗?
它中间是三个>>>,不是两个>>。如果是两个>>……
[/Quote]
我怎么按计算器也按不出你给的二进制值,负数补码最高位是1
magic_kid_2010
2012-10-21
打赏
举报
回复
[Quote=引用 1 楼 的回复:]
你把-8转化为32位的二进制数,然后无符号右移2位,再把它计算出来结果为:1073741822
[/Quote]
-8的二进制表示为:0000 0000 0000 0000 0000 0000 0000 1000?
右移两位为0000 0000 0000 0000 0000 0000 0000 0010,不是等于-2了吗?
它中间是三个>>>,不是两个>>。如果是两个>>,答案就是-2.
我发现一个问题:|-2| + 1073741822 = 1073741724 = 2^30。不知道是否是巧合。
Java位运算实战:从HashMap源码到算法优化,提升代码性能
位运算作为计算机底层核心操作,通过直接操作二进制位实现高效计算。其原理基于二进制与补码表示,利用与(&)、或(|)、异或(^)等运算符进行位级操作,能显著提升程序性能。技术价值在于减少CPU指令周期,优化内存使用,常见于高性能计算、算法优化和系统设计中。在Java开发中,位运算广泛应用于HashMap容量计算、线程池状态管理等场景,例如通过(n & (n-1))判断2的幂次方,或使用异或运算高效查找数组中唯一不重复的元素。掌握位运算能帮助开发者深入理解JDK源码,编写更高效的代码。
Java位运算实战:性能优化与高频面试题解析
位运算作为计算机基础运算之一,直接操作二进制位实现高效计算。其核心原理是通过与、或、异或等七种运算符对二进制数进行位级操作,相比传统算术运算具有显著性能优势。在Java开发中,位运算常用于性能优化、加密算法、图形处理等场景,也是技术面试的高频考点。通过位运算可以实现快速奇偶判断、变量交换等操作,在HashMap哈希优化、ThreadLocal魔数设计等JVM底层都有典型应用。掌握位运算不仅能提升代码效率,更能深入理解计算机系统底层原理,是Java开发者进阶必备技能。
Java运算符 二进制计算 素数问题 九九乘法表 月份问题 分解质因数 完全数问题 天数计算 图形
输出
/ 例如:setBit(10,3)返回14,因为10的二进制表示为1010,将第3位置为1后,变为1011,即14。System.out.
println
("\n101-200之间共有" + count + "个素数");System.out.
println
("这一天是该年的第" + dayOfYear + "天");System.out.
println
("请输入年份 月份 日期(用空格隔开):");System.out.
println
("请输入一个15以内的正整数:");
Java运算符本质:从字节码看JVM执行逻辑
Java运算符不是数学符号的简单映射,而是JVM字节码指令(如iadd、iinc、iload)的语法糖。其行为由操作数栈与局部变量表的底层交互决定,涉及隐式类型转换、副作用顺序、数值提升和短路
求
值等核心机制。理解这些原理,才能规避浮点精度丢失、自增嵌套歧义、复合赋值溢出等高频工程问题。本文以JDK 17为基准,通过javap反编译真实代码,揭示一元、二元、三元及复合赋值运算符在字节码层面的执行真相,帮助开发者建立从语法到JVM的贯通认知。
CoreJava-Day4
Java se学习
Java SE
62,621
社区成员
307,251
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章