java的左移运算符和右移运算符
- java移位运算小技巧
左移一位相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
右移一位相当于除以2的1次方,右移n位就相当于除以2的n次方。
比如
10 << 1 = 20
10 << 3 = 80
6 >> 1 = 3
6 >> 2 = 1
想要深入理解移位运算,就一定要对计算机的原码、反码、补码非常熟练。
你要知道的3个事(划重点):
(1)机器都是使用补码,运算也是使用补码运算。
(2)正数的原码补码反码都一样。
(2)补码与原码相互转换,其运算过程是相同。
- 原码,反码,补码
java里byte是占1个字节的,1个字节等于8个位。8个位里的第1位是符号位,用来表示是正数还是负数。
所以byte能表示的最大机器数也就是[0111 1111],也就是255。
byte a = 5 ;
[ +5 ] = 原码[ 0000 0101 ] = 反码[ 0000 0101 ] = 补码[ 0000 0101 ]
[ -5 ] = 原码[ 1000 0101 ] = 反码[ 1111 1010 ] = 补码[ 1111 1011 ]
- 怎么进行移位运算
移位运算符分左移位(<<)、右移(>>)、无符号右移(<<<)
其中无符号右移这里就不讨论了,java里没用到。
(1)左移
运算方式:数值的补码全部往左移动X位,符号位和最高位都舍弃,最低位补0。
正数:
int a = 5 ;
int b = a << 2 ;
[ 0000 0000 0000 0000 0000 0000 0000 0101 ] 5的补码
[ 0000 0000 0000 0000 0000 0000 0001 0100 ] 对于正数而言,反码就是原码,即 20
负数:
int a = -5 ;
int b = a << 2 ;
[ 1000 0000 0000 0000 0000 0000 0000 0101 ] -5的原码
[ 1111 1111 1111 1111 1111 1111 1111 1010 ] -5的反码
[ 1111 1111 1111 1111 1111 1111 1111 1011 ] -5的补码
[ 1111 1111 1111 1111 1111 1111 1110 1100 ] a<<2左移2位
将补码转换成原码就可以得到数值,补码转原码和原码转补码一样,上面说过了。
[ 1000 0000 0000 0000 0000 0000 0001 0011 ]
[ 1000 0000 0000 0000 0000 0000 0001 0100 ] 得到a<<2的原码,即 -20
左移n位就相当于乘以2的n次方
(2)右移
运算方式:数值的补码向右移X位,符号位不变(左边补上符号位)
正数:
int a = 8 ;
int b = a >> 1;
[ 0000 0000 0000 0000 0000 0000 0000 1000 ] 8的反码
[ 0000 0000 0000 0000 0000 0000 0000 0100 ] a>>1向右移1位
正数的反码就是原码,上面提过了两次,所以a>>1= 4
负数:
int a = -8 ;
int b = a >> 1 ;
[ 1000 0000 0000 0000 0000 0000 0000 1000 ] -8的原码
[ 1111 1111 1111 1111 1111 1111 1111 0111 ] -8的反码
[ 1111 1111 1111 1111 1111 1111 1111 1000 ] -8的补码
[ 1111 1111 1111 1111 1111 1111 1111 1100 ] a>>1向右移1位
补码转原码
[ 1000 0000 0000 0000 0000 0000 0000 0011 ]
[ 1000 0000 0000 0000 0000 0000 0000 0100 ] 得到a>>1的原码,即 -4
右移n位相当于除以2的n次方
4.Java里为什么要使用移位运算符
用移位操作可以极大地提高性能,因为在计算机底层对位的操作是最快的,没有之一!移位操作虽然快,但是可能会使代码不太好理解,因此最好加上相应的注释。
java的左移运算符和右移运算符相关推荐
- 左移运算符和右移运算符的使用
先简单介绍一下,左移运算符和右移运算符的功能: 计算机中的数字是以二进制补码的形式存放的,而左移和右移运算符就是将内存中的二进制补码数字向左或者右移动. 左移的结果: 1.左移会让最高 ...
- 【java基础】-java移位运算符:右移运算符和无符号右移运算符
下表列出了位运算符的基本运算,假设整数变量A的值为60和变量B的值为13: 操作符 描述 例子 & 如果相对应位都是1,则结果为1,否则为0 (A&B),得到12,即0000 1100 ...
- C++ 左移运算符和右移运算符的使用
<< 左移运算符的使用: 2 << 2 .表示2的2进制左移两位.乘以2的2次方.2 x 2的2次幂,结果为8 >> 右移运算符的使用:2 >> 1 ...
- java的左移位()和右移位()和无符号右移()
1.左移 ->左移运算符"<<" - 使指定值的所有位都左移规定的次数. ->左移m<<n 代表把数字m在无溢出的前提下乘以2的 ...
- 整数的左移运算符和右移运算符
因为数字在内存中是以补码形式存在的,因此,对于移位运算,也是对补码进行操作. 正数:首先正数的反码.补码都是本身,正数的左移就是高位补0,正数的右移就是低位补0. 例如:对于20: 原码:0001 0 ...
- 左移运算符和右移运算符
左移操作(<<) 规则: 右边空出的位用0填补 高位左移溢出则舍弃该高位. 例如:10 的二进制为 0000 1010 ,那么10左移3为就是 0101 0000,结果就是80. 10&l ...
- 位运算符:左移运算符、右移运算符、无符号右移运算符规则
规则: <<:左移 左边最高位丢弃,右边补齐0 >>:右移 最高位是0, ...
- java 左移 返回值_java左移右移运算符详解
在阅读源码的过程中,经常会看到这些符号<< ,>>,>>>,这些符号在Java中叫移位运算符,在写代码的过程中,虽然我们基本上不会去写这些符号,但需要明白这些 ...
- C++ 重载左移和右移运算符
C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool.int ...
最新文章
- C#部署安装,将用户安装路径记录下写入注册表,并启动
- 【热烈祝贺】俺们的S5PV210 工控板终于启动到wince桌面了!
- 在阿里云 ECS 上试图安装 SAP Commerce Cloud 的 137 错误
- 常见排序查询算法Java代码实现
- 容大打印机ip修改工具_M1芯片版Mac无法连接打印机怎么办?
- 云计算实战系列十二(Linux系统优化)
- 百度发布全新 NLG 训练模型 ERNIE-GEN,获 5 项 SOTA!
- 爬虫数据库一些简单的设计逻辑
- python读取sas数据集_利用Python获取SAS和R自带数据集
- 陕西大数据产业建设总投资达500亿元
- DICOM笔记-使用DCMTK读取DICOM文件保存DICOM文件
- 【caffe】Layer解读之:Date
- nas服务器加密文件夹,NAS加密文件夹创建和使用教程
- MSSQL2005的新功能创建数据库快照
- flutter手写板2.0 橡皮擦
- 读《Ideal MHD》(1)-磁流体力学方程组推导
- 英超前瞻乐.fun|体育 中秋利物浦主场对战狼队 历史交战能否延续全胜
- html画布画笔粗细,基于javascript html5 canvas实现可调画笔颜色/粗细/橡皮的涂鸦板...
- 特征选择——变量重要性排序
- 好风凭借力,送我上青云
热门文章
- 内存管理源码分析1-ARMV8-AARCH64 MMU 及 linux页表映射过程
- div 绝对定位覆盖
- 明基PD2710QC显示器体验报告
- C语言中一些库函数(字符串类型)的实现
- 职场3大涨工资技能,今天教你其中1个。
- 【Alios-things笔记】EMW3060 Flash用户数据存储KV
- 社区 专刊 积累成书 博客 大神 架构师
- C++ | 误差分析公式(均方根值(RMS)、均方根误差(RMSE)、标准差:均方差)(附代码)
- Python 之 处理 Excel 数据(5) —— 更新指定单元格的值
- 无线蓝牙运动耳机推荐,目前实用性不错的运动耳机推荐