java中的位移_Java中的位移运算

在Java中,位移运算属于基本运算,符号是<>,即向左位移和向右位移。在Java中只有整数才能位移,所以其他的不考虑,位移运算是将整数在内存中表示的二进制进行位移,所以在Java中分为正数和负数的位移。

对于正数来说,向左位移,即<>相当于除以2,注意是整数除以整数。例如 5 >> 1 即5/2=2。

下面举例说明:

5<<1,我们以int为例:

数字5

int型的二进制表示为: 0000 0000 0000 0000 0000 0000 0000 0101

向左移1位即: 0000 0000 0000 0000 0000 0000 0000 1010 (后位补0)

所以结果为:数字10

5>>1,我们以int为例:

数字5

int型的二进制表示为: 0000 0000 0000 0000 0000 0000 0000 0101

向右移1位即: 0000 0000 0000 0000 0000 0000 0000 0010 (高位补0)

所以结果为:数字2

所以对于正数,可以随意使用位移,与乘除几乎没有结果的区别,而且性能更优。

而对于负数来说,Java中的位移应该谨慎使用,因为位移运算在Java中称为带符号的位移。那么到底带符号的位移是如何计算的呢,下面直接举例说明:

-5<<1,我们以int为例,由于负数在内存是以补码存在,请看:

数字-5

int型的二进制原码表示为: 1000 0000 0000 0000 0000 0000 0000 0101

而其反码为:1111 1111 1111 1111 1111 1111 1111 1010

补码为:1111 1111 1111 1111 1111 1111 1111 1011

向左移1位即结果为:1111 1111 1111 1111 1111 1111 1111 0110 (后位补0)

将结果计算反码为:1111 1111 1111 1111 1111 1111 1111 0101

将结果计算原码为:1000 0000 0000 0000 0000 0000 0000 1010

所以结果为:数字-10

看起来好像还是乘以2,但是换个数字来试试:

例如数字的二进制如果为:1110 0000 0000 0000 0000 0000 0000 0001

而其反码为:1001 1111 1111 1111 1111 1111 1111 1110

补码为:1001 1111 1111 1111 1111 1111 1111 1111

向左移1位即结果为:0011 1111 1111 1111 1111 1111 1111 1110

这个结果的最高位是0,所以必然是个正数,所以结果并非想象的乘以2。

如果是右移,那么高位会补1,结果一样不算正常,例如:

-5>>1,我们以int为例,由于负数在内存是以补码存在,请看:

数字-5

int型的二进制原码表示为: 1000 0000 0000 0000 0000 0000 0000 0101

而其反码为:1111 1111 1111 1111 1111 1111 1111 1010

补码为:1111 1111 1111 1111 1111 1111 1111 1011

向右移1位即结果为:1111 1111 1111 1111 1111 1111 1111 1101 (高位补1)

将结果计算反码为:1111 1111 1111 1111 1111 1111 1111 1100

将结果计算原码为:1000 0000 0000 0000 0000 0000 0000 0011

所以结果为:数字-3

而在Java中,-5除以2应该结果为-2,但是位移却为-3。

另外,如果是下面的例子:

-1>>1,我们以int为例,由于负数在内存是以补码存在,请看:

数字-1

int型的二进制原码表示为: 1000 0000 0000 0000 0000 0000 0000 0001

而其反码为:1111 1111 1111 1111 1111 1111 1111 1110

补码为:1111 1111 1111 1111 1111 1111 1111 1111

向右移1位即结果为:1111 1111 1111 1111 1111 1111 1111 1111 (高位补1)

所以结果不用慢慢算就知道为:数字-1

所以对于-1来说,无论怎么右移,结果还是-1,而如果是除以2,结果是0。

最后总结一句,如果是正数,当可以使用位移运算时可以尽量使用,能提升性能,而对于负数来说,还是尽量别用吧,结果与除法相差太远。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis源码分析之(四)mapper访问数据库的底层原理(代理方法中具体访问数据库的细节)

从之前的文章&#xff0c;我们知道了其实mapper真正执行的方法就下面的最后两行。&#xff08;以下所有的分析都基于一次mybatis的一次select查询。 MapperProxy类中的invoke函数 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {try {i…

mysql count distinct case when_统计符合条件的去重过的数量 - - count distinct if case

现有表结构&#xff1a;CREATE TABLE example_dataset (id int(11) unsigned NOT NULL AUTO_INCREMENT,tel bigint(11) DEFAULT NULL,gender varchar(11) DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8mb4;插入数据INSERT INTO example_da…

Mybatis源码分析之(六)mybatis拦截器(Interceptor)的实现原理

文章目录前言InterceptorChain保存所有的Interceptor创建四大对象都走ConfigurationInterceptorChain增强对象方法Plugin封装动态代理&#xff0c;让你使用Mybatis拦截器更简单Invocation&#xff0c;让我们能在拦截器中使用动态代理类中的invoke方法中的对象调用时序图小结前言…

Mybatis源码分析之(七)Mybatis一级缓存和二级缓存的实现

文章目录一级缓存二级缓存总结对于一名程序员&#xff0c;缓存真的很重要&#xff0c;而且缓存真的是老生常谈的一个话题拉。因为它在我们的开发过程中真的是无处不在。今天LZ带大家来看一下。Mybatis是怎么实现一级缓存和二级缓存的。(自带的缓存机制)一级缓存 存在BaseExecu…

oauth2 java 获取token_OAuth2 Token 一定要放在请求头中吗?

Token 一定要放在请求头中吗&#xff1f; 答案肯定是否定的&#xff0c;本文将从源码的角度来分享一下 spring security oauth2 的解析过程&#xff0c;及其扩展点的应用场景。Token 解析过程说明当我们使用 spring security oauth2 时, 一般情况下需要把认证中心申请的 token …

Map.getOrDefault()方法

default V getOrDefault(Object key, V defaultValue) {V v;return (((v get(key)) ! null) || containsKey(key))? v: defaultValue;}这是源码&#xff0c;意思就是当Map集合中有这个key时&#xff0c;就使用这个key对应的value值&#xff0c;如果没有这个key就使用默认值de…

java开发原则_java开发中,大家处理异常的原则是什么,是如何处理的?

展开全部最熟悉的陌生人&#xff1a;异常异常的类e5a48de588b63231313335323631343130323136353331333361326365型Throwable— Exception—- RuntimeException— Error需要注意的是&#xff0c;RuntimeException及其子类不需要在方法签名中显示注明异常抛出。例如&#xff1a;v…

java8合并两个Map

合并两个Map map自己的方法 实现方式是通过 putAll() 方法将多个 map 对象中的数据放到另外一个全新的 map 对象中&#xff0c;代码如下所示&#xff0c;展示了两个 map 对象的合并&#xff0c;如果是多个 map 合并也是用这种方式。 public static void main(String[] args) {…

java 线程 spring_java中spring里实现多线程

Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程的可使用ThreadPoolTaskExecutor来实现基于线程池的TaskExecutor在实际开发中由于多是异步&#xff0c;所以使用EnableAsync来支持异步任务&#xff0c;且要在Bean的方法中使用Async来声明其是一个异步任务?????…

java8 Map新增方法的使用

文章目录 文章目录文章目录java8 Map新增方法的使用概述1、compute()1、使用2、源码实现2、computeIfAbsent()1、使用2、源码3、computeIfPresent()4、merge()1、使用2、源码5、接下来简单介绍一下1.8之后Map添加的default方法map新增的方法&#xff1a;getOrDefaultforEachput…

java自动识别验证码_Java使用OCR技术识别验证码实现自动化登陆方法

活动介绍缘起是 GitChat 作者群有一位作者提出是否应该定期组织一些写作活动&#xff0c;活跃一下社区氛围&#xff0c;刚好 GitChat 内容组的小伙伴们也有这个想法&#xff0c;既然想法碰到一起&#xff0c;那就说做就做。既然是第一期&#xff0c;那么我们就定一个比较广的主…

出现503错误 怎么办

展开全部 出现503错误原因及解决办法 原因&#xff1a;web服务器不能处理HTTP请求&#xff0c;可能是临时超载或者是服务器进行维护。 解决办法&#xff1a;用户需要等待服务器的临时处理。在这种状态下&#xff0c;一些服务器可以简单的拒绝socket连接&#xff0c;否则会发…

sql语句优化总结 mysql_MySQL-SQL优化总结

转载:https://blog.csdn.net/qq_39390545/article/details/107020686理解SQL优化原理 &#xff0c;首先要搞清楚SQL执行顺序&#xff1a;SELECT语句 - 语法顺序:SELECTDISTINCT FROM JOIN ON WHERE GROUP BY HAVING ORDER BY LIMIT SELECT语句 - 执行顺序&#xff1a;FROM# 选取…

java枚举类中字段有没有必要加final____枚举类字段 Field ‘xxx‘ may be ‘final‘

java枚举类中字段有没有必要加final 今天在写一个系统统一返回码的枚举类时候&#xff0c;突然想到一个问题&#xff0c;当不小心手抖给枚举类自动生成了set方法&#xff0c;而恰巧在用的地方不小心用了set方法&#xff0c;从而修改了code值&#xff0c;由于枚举类是天然单例&a…

calcite连接mysql_calcite简单入门

1 介绍Apache Calcite是一款开源的动态数据管理框架&#xff0c;它提供了标准的 SQL 语言、多种查询优化和连接各种数据源的能力&#xff0c;但不包括数据存储、处理数据的算法和存储元数据的存储库。Calcite 之前的名称叫做optiq&#xff0c;optiq 起初在 Hive 项目中&#xf…

MySQL数据库索引及失效场景

文章目录1. MySQL索引概述1.1 索引的概念1.2 索引的特点1.3 索引的分类1.4 索引的使用场景2. 索引失效场景2.1 索引失效9种场景2.2 索引失效场景总结3. 索引失效验证3.1 全值匹配3.2 最佳左前缀3.3 索引计算3.4 索引范围&#xff1a;索引列上不能有范围查询3.5 索引覆盖&#x…

getLong java_java.lang.Long.getLong()方法实例

全屏java.lang.Long.getLong(String nm) 方法确定具有指定名称的系统属性的long值。如果没有具有指定名称的属性&#xff0c;如果指定名称为空或null&#xff0c;或者该属性没有正确的数字格式&#xff0c;则返回null。声明以下是java.lang.Long.getLong()方法的声明public sta…

@JsonProperty注解解析

1. 概述 来源: JsonPrpperty是jackson包下的一个注解&#xff0c;详细路径(com.fasterxml.jackson.annotation.JsonProperty;)作用:JsonProperty用在属性上&#xff0c;将属性名称序列化为另一个名称。例子&#xff1a;public class Person{JsonProperty(value "name&qu…

java内部类为什么使用很少_java内部类有什么好处?为什么需要内部类?

提起Java内部类(Inner Class)可能很多人不太熟悉&#xff0c;实际上类似的概念在C里也有&#xff0c;那就是嵌套类(Nested Class)&#xff0c;关于这两者的区别与联系&#xff0c;在下文中会有对比。内部类从表面上看&#xff0c;就是在类中又定义了一个类(下文会看到&#xff…

jdk中提供的Collection、Collections、Collector、Collectors你分的清楚?

初次一看四个有点相似&#xff0c;而且有些时候一不小心还真有可能敲错&#xff0c;因为喜欢代码提示没仔细看提示&#xff0c;结果通过.去调用结果发现没有找到你想用的方法。所以写代码的时候需要注意一点这个区别 Collections.emptyList(); Collectors.toMap(......);//所在…