java左移和右移_java 位运算 之 左移和右移理解
<>(右移)皆属于位运算符.其运算比乘除快,所以我们可以用其优化代码。
<
规则则是带符号位移,高位移出,低位补0,移动位数超过该类型的最大位数,则进行取模,如对Integer型左移34位,实际上只移动了两位。左移一位相当于乘以2的一次方,左移n位相当于乘以2的n次方。
Integer i = 7;
message(Integer.toBinaryString(i));int moveNum = 3;
message(i<
message(Integer.toBinaryString(i<
输出结果
the value is :111the value is :56the value is :111000
从上面代码可以看出确实能证明,左移n为,相当于乘以2的n次方。如何验证其带符号位位移呢?看下面的例子
Integer i = 1;
message(Integer.toBinaryString(i));int moveNum = 31;
message(i<
message(Integer.toBinaryString(i<
输出结果
the value is :1the value is :-2147483648the value is :10000000000000000000000000000000
从上面的输出结果可以看出,左移确实是带着符号位移动,向左移动了31位,1就移动到了最前面,也就是符号位上,得到了一个特殊的值,也就是-0的补码,用来代表-2的3次方。如果这个不懂,可以去看下源码反码补码的博客.
Integer i = -7;
message(Integer.toBinaryString(i));int moveNum = 33;
message(i<
message(Integer.toBinaryString(i<
输出结果
the value is :11111111111111111111111111111001the value is :-14the value is :11111111111111111111111111110010
由上面的代码可以看出,我们左移的位数是33位,实际上却只左移了1位,证实了上面所说的移动位数超过该类型的最大位数,则进行取模
>>右移
规则则是低位移出,高位补符号位,移动位数超过该类型的最大位数,则进行取模,如对Integer型左移34位,实际上只移动了两位。
Integer i = -7;
message(Integer.toBinaryString(i));int moveNum = 1;
message(i>>moveNum);
message(Integer.toBinaryString(i>>moveNum));
输出结果
the value is :11111111111111111111111111111001the value is :-4the value is :11111111111111111111111111111100
上面的二进制都是补码的形式,不要疑惑这个。可以看出上面的二进制代码,向右移动一位,然后在其高位补符号位,正数补0,负数补1.
Integer i = 7;
message(Integer.toBinaryString(i));int moveNum = 34;
message(i>>moveNum);
message(Integer.toBinaryString(i>>moveNum));
输出结果
the value is :111the value is :1the value is :1
上面的代码,左移34位,实际上却只左移了两位,已经做过取模了。由于是正数,高位补0。
>>> 无符号右移
无符号位移是什么意思呢,就是右移的时候,无论正负数,高位始终补0。当然,它也仅仅针对负数计算有意义。
Integer i = -7;
message(Integer.toBinaryString(i));int moveNum = 1;
message(i>>>moveNum);
message(Integer.toBinaryString(i>>>moveNum));
输出结果
the value is :11111111111111111111111111111001the value is :2147483644the value is :1111111111111111111111111111100
上面代码中,右移一位后的值,其高位省略了一位0,我们来计算其值。
就是2的31次方 - 1 - 2º-2¹,其结果为2147483644
<<< 无符号左移
为什么没有这个呢?大家可以想一下。
————————————————
原文:https://blog.csdn.net/koreyoshi326/java/article/details/85008708
java左移和右移_java 位运算 之 左移和右移理解相关推荐
- 【Python位运算】——左移操作(<<)右移操作>>
目录 左移操作 右移操作 其他博主的理解 应用--力扣题目78. 子集 解法 深度优先搜索 位运算 参考文献 左移操作 # 左移操作,左移一位相当于乘以b,a<<b,a' = a*(2^b ...
- java double 位运算_JAVA位运算等运算符总结
JAVA位运算等运算符总结 一.概述 运算符是一种"功能"符号,用以通知 Java 进行相关的运算. Java 语言中常用的运算符可分为如下几种:算术运算符 赋值运算符 比较运算符 ...
- java 位运算符在实际开发中的用处_java 位运算 和实际应用
public class Test { public static void main(String[] args) { // 1.左移( < // 0000 0000 0000 0000 00 ...
- java加减_Java位运算实现加减乘除
一.加法 a+b 举例实现:13+9=22 13+9不考虑进位结果为12 只考虑进位结果为10 和刚好是22. 13二进制为1101,9二进制为1001. 不考虑进位结果为0100.算式为a^b 只考 ...
- java取余位运算_java位运算
位移动运算符: < 例如:3 <<2(3为int型) 1)把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011, 2)把该数字高位(左侧 ...
- java取余位运算_Java位运算基础知识
在学习Java运算时,补充学习Java位运算. Java位运算 位运算都是针对整数的补码进行位运算. & 按位与运算 先将整数转换为补码 ,然后执行按位与运算,最后将结果返回为十进制,它有如下 ...
- java符号位_java 位运算符号
<道生一,一生二,二生三,三生万物>出自老子的<道德经>第四十二章.主要讲述了一.二.三这几个数字,并不把一.二.三看作具体的事物和具体数量.它们只是表示"道&quo ...
- 位运算之左移右移运算之详解
先看如下一段左移右移的代码及其结果: 代码 #include "stdio.h" char leftshift(char i, int n) { if(n < 0) retu ...
- java 无符号运算_java位运算和无符号运算
计算机在底层使用的是二进制补码进行运算. 计算规则: 正数的原码.反码.补码是其二进制本身. 负数的原码首先计算其二进制数,然后最高位使用1表示负数,反码是最高位不变其它位取反,补码是在反码的基础上进 ...
- java位非_Java 位运算(移位、位与、或、异或、非)
public class Test { public static void main(String[] args) { // 1.左移( << ) // 0000 0000 0000 0 ...
最新文章
- [three.js]学习笔记
- 使用Spring Boot开发Restful程序
- 四年级信息技术认识计算机,四年级信息技术第三课信息工具知多少
- 水晶报表-控制结构-For 循环(Crystal 语法)
- 垂直居中——登录界面
- mvn本地库导入jar包
- ajax请求在线库,跨域 jQuery库ajax请求
- 作品拍卖价碾压毕加索,没有灵魂的 AI 灵魂画手有怎样的未来?
- 判断客户端是否安装FlashPlayer及版本
- 通过sql脚本可以从数据库中查到数据,但是通过jdbc却获取不到
- 30分钟用flex测试FDS
- 中南天坑专业到武大计算机的考研分享~
- Java读取文件的N种方法
- C语言——单词精确查找
- ubuntu自带Firefox安装flash插件
- iPhone开发 - 3D - 建立3D界面(下)
- 成功解决 HP1010在WIN7下打印速度慢问题
- linux的c文件报错for,linux c 编译错误 conflicting types for 的解决办法
- 福建食用菌产业博览会盛大开幕 谋定中国农民丰收节交易会
- cygwin+编译php,Windows 下:cygwin编译 HTS 安装