1. 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)补码与原码相互转换,其运算过程是相同。

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 ]

3. 怎么进行移位运算

移位运算符分左移位(<>)、无符号右移(<<

其中无符号右移这里就不讨论了,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左移负数位_java的左移运算符和右移运算符相关推荐

  1. 左移运算符和右移运算符的使用

    先简单介绍一下,左移运算符和右移运算符的功能:         计算机中的数字是以二进制补码的形式存放的,而左移和右移运算符就是将内存中的二进制补码数字向左或者右移动. 左移的结果: 1.左移会让最高 ...

  2. java中右移_Java中的按位右移运算符

    Java支持两种类型的右移运算符.>>运算符是有符号的右移运算符,而>>>是无符号的右移运算符.左操作数的值向右移动右操作数指定的位数. 签名右移运算符 带符号的右移运算 ...

  3. C++ 左移运算符和右移运算符的使用

    << 左移运算符的使用:  2 << 2 .表示2的2进制左移两位.乘以2的2次方.2 x 2的2次幂,结果为8 >> 右移运算符的使用:2 >> 1 ...

  4. 整数的左移运算符和右移运算符

    因为数字在内存中是以补码形式存在的,因此,对于移位运算,也是对补码进行操作. 正数:首先正数的反码.补码都是本身,正数的左移就是高位补0,正数的右移就是低位补0. 例如:对于20: 原码:0001 0 ...

  5. 【java基础】-java移位运算符:右移运算符和无符号右移运算符

    下表列出了位运算符的基本运算,假设整数变量A的值为60和变量B的值为13: 操作符 描述 例子 & 如果相对应位都是1,则结果为1,否则为0 (A&B),得到12,即0000 1100 ...

  6. java的左移运算符和右移运算符

    java移位运算小技巧 左移一位相当于乘以2的1次方,左移n位就相当于乘以2的n次方. 右移一位相当于除以2的1次方,右移n位就相当于除以2的n次方. 比如 10 << 1 = 20 10 ...

  7. 位运算符:左移运算符、右移运算符、无符号右移运算符规则

    规则: <<:左移                         左边最高位丢弃,右边补齐0     >>:右移                         最高位是0, ...

  8. java中的减_Java中的增量和减量运算符

    我对增量和减量运算符有疑问.我不明白为什么Java会给出这些输出. x = 5;  y = 10; System.out.println(z = y *= x++); // output is 50 ...

  9. 左移运算符和右移运算符

    左移操作(<<) 规则: 右边空出的位用0填补 高位左移溢出则舍弃该高位. 例如:10 的二进制为 0000 1010 ,那么10左移3为就是 0101 0000,结果就是80. 10&l ...

  10. java取整数位_java获取整数的各位数值

    第一种是取模运算 int qian =input/1000; //千位除以1000 int bai = input/100%10;//百位除以100%10 int shi = input%100/10 ...

最新文章

  1. 第六周项目一-分数类的雏形(1)
  2. Python基本语法_基本数据类型_字典类型详解
  3. springboot 做表白墙_华农表白墙144期 | 等什么时候,她从我开的花店前经过,我把整个花店送个她可好。...
  4. 下一代 Web 应用模型 —— Progressive Web App (PWA)
  5. android mock测试资源,Android 单元测试 --Mock 及 Mockito
  6. 识别它的飞鸽传书2012方法是光圈环
  7. 如何把nas的功能效果最大化?
  8. 解决springmvc加载JS,CSS等文件问题【转】
  9. Yarn和SparkAlone对比
  10. AjaxPro实现方法
  11. 将windows项目移植到linux上
  12. saltstack minion端状态监控程序
  13. 声卡测试音频100Hz~1KHz
  14. Md5加密工具类DigestUtils
  15. 财务管理系统-数据库模块
  16. 11.构建Ubuntu系统
  17. 【Qt】边学边写之Qt教程(零基础)
  18. TCP报文( tcp dup ack 、TCP Retransmission)
  19. C语言设计学生宿舍管理系统
  20. CF919C Seat Arrangements

热门文章

  1. 实战:京东购物车静态界面实现
  2. Java编程:排序算法——归并排序
  3. LESS:基础用法学习笔记
  4. 基于SpringBoot+Mybatis+Thymeleaf的信息管理系统
  5. jquery的函数介绍和使用
  6. 使用字符流FileReader读取文本文
  7. Ubuntu16.04下完美切换Python版本
  8. 三维重建笔记_重建方法简介与汇总
  9. 基于RGB图像的机器人抓取算法汇总
  10. Unity 阴影的制作方式