Java中有趣的移位操作!彻底弄懂各个移位操作符的使用方式

<<
- <<: 左移运算,左移几位就补几个0
>>
- >>: 右移运算,为算术右移
- 如果数字为正数时,移位后在前面补0
- 如果数字为负数时,移位后在前面补1
>>>
- >>>: 无符号右移,为逻辑右移.忽略符号,空位补0
- 无符号右移规则: 忽略了符号位扩展,0补最高位,无符号右移运算符 >>> 只对32位和64位值有意义
- 如果要移位的数是正数时:
- 右移和无符号右移的值是一样的
- 如果要移位的数是负数时:
- 右移后的值还是负数
- 无符号右移后的值则为正数
- 区别:
- 对于正数而言 ,>> 和 >>> 没有区别
- 对于负数而言,由于无符号右移忽略了最高位数的符号位.所以:
- -2 >>> 1 = 2147483647(Integer.MAX_VALUE)
- -1 >>> 1 = 2147483647(Integer.MAX_VALUE)
- 因此要判断两个Integer类型的数符号是否相同,可以这样判断:
return ((a >> 31) ^ (b >> 31)) == 0;
移位运算结果
- 在不大于自身数值类型最大位数的移位时,一个数左移n位,就是将这个数乘以2的n次幂
- 一个数右移n位,就是将这个数除以2的n次幂,然后取整
- 如果移动位数超出自身数值类型的最大位数, 只要将移位数和自身数值类型的最大位数取余得到的数字套用方法即可
注意
- 三种移位运算作用的左操作数有五种:
- long
- int
- short
- byte
- char
- 在作用不同的操作数类型时的具体操作过程不同,遵循以下原则:
- int移位时, 左操作数是32位,此时移位符号作用在32位bit上
- 比如: 1 >> 3,是将00000000 00000000 00000000 00000001这32位向右移动3位
- long移位时,左操作数是64位,此时移位符号作用在64位bit上
- short,byte,char在移位之前首先将数据转换为int, 然后再移位,此时移位符号作用在32位bit上
- 比如: (byte)0xff >>> 7,是将11111111 11111111 11111111 11111111这32位向右移动7位,得到的结果是00000001 11111111 11111111 11111111
- int移位时, 左操作数是32位,此时移位符号作用在32位bit上
- 由上可知:
- 当左操作数为long时,移位之后得到的类型是long
- 当左操作数是其它四种类型时,移位之后得到的类型时int
- 所以当左操作数是short,byte,char时,使用 >>=, >>>=, <<= . 其实是将得到的int做低位截取得到的数值,得到的值往往会错
- 三种移位符号除了对左操作数有操作规则外,对右操作数也有操作规则:
- 如果左操作数是int或者转换之后是int, 那么右操作数只有低5位有效,因为int总共就32位
- 22 >> 33 与 22 >> 1 的结果是一样的,都是11
- 如果左操作数是long, 那么右操作数只有低6位有效
- 如果左操作数是int或者转换之后是int, 那么右操作数只有低5位有效,因为int总共就32位
Java中有趣的移位操作!彻底弄懂各个移位操作符的使用方式的更多相关文章
- TensorFlow中实现RNN,彻底弄懂time_step
这篇博客不是一篇讲解原理的博客,这篇博客主要讲解tnesorlfow的RNN代码结构,通过代码来学习RNN,以及讲解time_steps,如果这篇博客没有让你明白time_steps,欢迎博客下面评论 ...
- 【Tomcat】JVM,Tomcat,Servlet,Tomcat中的应用。彻底弄懂这些概念之间的联系
tomcat和tomcat中的应用(即webapps下的war包)是运行在同一个jvm中的,但分工不同. tomcat的角色是“调度员”,而你的应用的角色是“工作者”,tomcat处理一个请求的大致过 ...
- Java中有趣的String、StringBuffer与StringBuilder
String介绍 String类属于java.lang包中,String类是不可变类,任何对String的改变都会引发新的String对象的生成. 创建String的两种方式: 1.通过构造器创建:S ...
- java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总
若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. ...
- Java中简单的操作(if语句、常用操作符、switch语句、变量赋值等)
---------------------if语句介绍--------------------------------------------------- class IfDemo { public ...
- Java中不定项参数(可变参数)的作用和使用方式
引言: 我们在编写方法的过程中,可能会遇见一个方法有不确定参数个数的情况.一般我们会用方法重载来解决问题: //方法重载,解决参数个数不确定问题 public void method(); publi ...
- 转:在java中使用dom4j解析xml
JAVA 使用Dom4j 解析XML Java DOM4J Parser - Parse XML Document Dom4j下载及使用Dom4j读写XML简介 在java中使用dom4j解析xml ...
- ZeroMQ(java)中的数据流SessionBase与SocketBase
前面的文章中已经比较的清楚了ZeroMQ(java)中如何在底层处理IO, 通过StreamEngine对象来维护SelectableChannel对象以及IO的事件回调,然后通过Poller对象来维 ...
- ZeroMQ(JAVA)中的数据流,SessionBase与SocketBase
前面的文章中已经比较的清楚了ZeroMQ(java)中如何在底层处理IO, 通过StreamEngine对象来维护SelectableChannel对象以及IO的事件回调,然后通过Poller对象来维 ...
随机推荐
- Java 语言的主要特性
Java语言是简单的 Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用. Java丢弃了C++中很少使用的.很难理解的.令人迷惑的那些特性,如操作符重载.多继承.自动的强 ...
- python3 贪吃蛇小游戏
贪吃蛇 #!/usr/bin/env python import pygame,sys,time,random from pygame.locals import * # 定义颜色变量 redColo ...
- STM32定时器配置
void TIM1_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDe ...
- 工作流引擎详解!工作流开源框架ACtiviti的详细配置以及安装和使用
创建ProcessEngine Activiti流程引擎的配置文件是名为activiti.cfg.xml的XML文件.注意与使用Spring方式创建流程引擎是不一样的 使用org.activiti.e ...
- vue+element-ui, el-upload组件 文件上传之前return false,会自动调用文件移除回调问题
日常搬砖的时候,项目中在使用element-ui的上传组件,但是当我在文件上传文件之前的回调里面做了些文件格式的二次校验和文件大小的校验的时 然后 return false 会发现调用 文件移除的回调 ...
- unity项目字符串转为Vector3和Quaternion
运用环境:一般在读取csv表格的数据时是string类型转为Vector3或者Quaternion类型 字符串格式:x,x,x /x,x,x,x (英文逗号) 方法: /// <summary& ...
- Hadoop MapReduce 一文详解MapReduce及工作机制
@ 目录 前言-MR概述 1.Hadoop MapReduce设计思想及优缺点 设计思想 优点: 缺点: 2. Hadoop MapReduce核心思想 3.MapReduce工作机制 剖析MapRe ...
- Django学习之完成数据库主从复制、读写分离和一主多从情况下的使用办法
1.首先配置多个数据库,在settings配置文件中配置以下内容: DATABASES = { 'default': { #默认数据库,配置多个mysql数据也是ok的,混用数据库也是ok的 'ENG ...
- Ajax|看这一篇就够了!详解Ajax工作原理及开发步骤
传统开发的缺点,是对于浏览器的页面,全部都是全局刷新的体验.如果我们只是想取得或是更新页面中的部分信息那么就必须要应用到局部刷新的技术. 局部刷新也是有效提升用户体验的一种非常重要的方式. Ajax技 ...
- 状压dp(总结)状态压缩
状压这个和二进制分不开关系 所以,对于二进制的熟悉是必不可少的技能 & 与操作,1不变,0变0 | 或操作,0不变,1变1 ^ 异或操作,0不变,1取反 - 取反操作,把每一个二进制位0 ...