深入解析Java移位运算符

移位运算符是 Java 中常见的位操作符,主要包括左移(<<)、带符号右移(>>)和无符号右移(>>>)。这些运算符在性能优化、低级编程、数据压缩等领域广泛应用,理解和掌握它们的使用方式和注意事项非常重要。

移位运算符概述
  1. 左移运算符(<<

    • 向左移动操作数的二进制表示,右边用零填充。
    • 等同于乘以2的n次方(不溢出的情况下)。

    java

    int x = 2;
    int result = x << 1; // result = 4
  2. 带符号右移运算符(>>

    • 向右移动操作数的二进制表示,左边用符号位填充(正数补0,负数补1)。
    • 等同于除以2的n次方。

    java

    int x = 4;
    int result = x >> 1; // result = 2
  3. 无符号右移运算符(>>>

    • 向右移动操作数的二进制表示,左边用零填充。
    • 忽略符号位。

    java

    int x = -4;
    int result = x >>> 1; // result = 2147483646
示例:HashMap中的移位运算

在Java标准库中,HashMaphash方法使用了移位运算符来优化哈希值的计算:

java

static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

此处的>>>运算符用于减少哈希冲突,提高哈希表的访问性能。

移位运算符的注意事项
  1. 适用数据类型
    移位操作符支持的类型只有intlong。编译器在对shortbytechar类型进行移位前,会将其转换为int类型。

  2. 移位超出位数
    当移位的位数超过数值类型所占的位数时,会先对移位位数取模。例如,对于int类型来说,x << 35等同于x << 3,因为35 % 32 = 3。

性能优化示例

通过移位运算进行乘法和除法操作可以优化性能,尤其是在需要进行大量运算的情况下:

java

// 普通乘法
int multiplyBy2 = x * 2;
// 移位运算
int multiplyBy2Shift = x << 1;

上面两段代码功能相同,但使用移位运算的代码通常执行得更快。

代码实例

下面通过一个实例详细展示左移运算符的效果:

java

public class ShiftOperatorExample {public static void main(String[] args) {int i = -1;System.out.println("初始数据:" + i);System.out.println("初始数据对应的二进制字符串:" + Integer.toBinaryString(i));i <<= 10;System.out.println("左移 10 位后的数据:" + i);System.out.println("左移 10 位后的数据对应的二进制字符串:" + Integer.toBinaryString(i));// 左移42位,相当于左移10位int j = -1;j <<= 42;System.out.println("左移 42 位后的数据:" + j);System.out.println("左移 42 位后的数据对应的二进制字符串:" + Integer.toBinaryString(j));}
}

输出结果:

txt

初始数据:-1
初始数据对应的二进制字符串:11111111111111111111111111111111
左移 10 位后的数据:-1024
左移 10 位后的数据对应的二进制字符串:11111111111111111111110000000000
左移 42 位后的数据:-1024
左移 42 位后的数据对应的二进制字符串:11111111111111111111110000000000

从输出可以看出,左移42位的效果与左移10位相同,这是因为左移位数超过了int类型的位数,进行了取模运算。

总结

掌握和理解Java中的移位运算符可以帮助我们在编程中写出更高效的代码,特别是在处理大规模数据和性能优化方面。希望通过本文的详细讲解和实例演示,能够帮助读者更好地理解和应用这些运算符。


希望这些内容对你有所帮助!如果有任何问题或进一步的讨论,欢迎在评论区留言。

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

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

相关文章

Qt学习笔记1.3.4 QtCore-Qt资源系统

文章目录 资源收集文件(.qrc)外部二进制资源内编译(compiled-in)资源压缩使用应用程序中的资源使用库中的资源 Qt资源系统是一种 独立于平台的机制&#xff0c;用于在应用程序的可执行文件中存储二进制文件。如果您的应用程序总是需要一组特定的文件(图标、翻译文件等)&#x…

QT状态机8-使用恢复策略自动恢复属性

当状态分配的属性不再活动时,可能希望将其恢复到初始值,通过设置全局的恢复策略可以使状态机进入一个状态而不用明确制定属性的值。 QStateMachine machine; machine.setGlobalRestorePolicy(QStateMachine::RestoreProperties);当设置了恢复策略以后,状态机将自动恢复所有…

sklearn中多分类和多标签分类评估方法总结

一、任务区分 多分类分类任务&#xff1a;在多分类任务中&#xff0c;每个样本只能被分配到一个类别中。换句话说&#xff0c;每个样本只有一个正确的标签。例如&#xff0c;将图像分为不同的物体类别&#xff0c;如猫、狗、汽车等。 多标签分类任务&#xff1a;在多标签分类任…

助力数字农林业发展服务香榧智慧种植,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建香榧种植场景下香榧果实检测识别系统

作为一个生在北方但在南方居住多年的人&#xff0c;居然头一次听过香榧&#xff08;fei&#xff09;这种作物&#xff0c;而且这个字还不会念&#xff0c;查了以后才知道读音&#xff08;fei&#xff09;&#xff0c;三声&#xff0c;这着实引起了我的好奇心&#xff0c;我相信…

Linux端口状态含义

目录 前言1. 前沿知识2. 基本知识 前言 在面试或者企业实战中常见的命令 那就是查询端口命令是哪个 1. 前沿知识 查询端口命令&#xff1a;lsof -i 查询端口的状态&#xff1a;netstat 命令参数说明-tTCP端口-uUDP端口-p进程表示符和程序名称-n显示IP 常用的netstat结合g…

MATLAB基础应用精讲-【数模应用】多选题分析

目录 几个高频面试题目 设计问卷及数据分析 SPSSAU多选题分析常见问题

百度网盘搭建知识付费系统,绘画网课怎么招生?招生怎么出效果?

现在的小孩真的是多才多艺&#xff0c;各种爱好都有等级证书&#xff0c;当然&#xff0c;这也就离不开家长报班的培养&#xff0c;尤其是&#xff0c;现在的绘画课程也是很受欢迎的&#xff0c;那作为绘画网课课程学校要怎么招生?这也是学校常年的目标之一。 招生怎么出效果?…

STM32使用ADC单/多通道检测数据

文章目录 1. STM32单片机ADC功能详解 2. AD单通道 2.1 初始化 2.2 ADC.c 2.3 ADC.h 2.4 main.c 3. AD多通道 3.1 ADC.c 3.2 ADC.h 3.3 main.c 3.4 完整工程文件 1. STM32单片机ADC功能详解 STM32单片机ADC功能详解 2. AD单通道 这个代码实现通过ADC功能采集三脚电…

代码随想录三刷day51

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣200. 岛屿数量二、力扣695. 岛屿的最大面积三、力扣1020. 飞地的数量四、力扣130. 被围绕的区域 前言 依然是从地图周边出发&#xff0c;将周边空格相邻…

Vue学习v-on

Vue学习v-on 一、前言1、基本用法2、事件修饰符3、事件对象4、动态事件名5、事件修饰符和按键修饰符6、自定义事件 二、总结 一、前言 v-on 是 Vue.js 中用于监听 DOM 事件的指令。它可以在触发特定事件时执行指定的 JavaScript 代码或者调用 Vue 实例中的方法。下面我来详细介…

【Vue2】关于response返回数据的错误小记

关于Vue2中response返回数据的一个错误小记 如图&#xff0c;在这里返回的时候&#xff0c;后端是通过List< String >返回的&#xff0c;response接收到的实际上是一个Array数组&#xff0c;但是赋值给searchedTaskList的时候&#xff0c;需要在.then包括的范围里面赋值给…

c++ prime笔记①

1. 大多数计算机都以2的整数次幂个比特为块来处理内存&#xff0c;可以寻址的最小内存块称为“字节”&#xff0c;存储的基本单元为“字”&#xff0c;字由字节组成&#xff0c;字节大多数由8比特构成。 2. 无符号类型仅能表示大于0的值 注意&#xff1a;与其余的内置类型相…

【SpringBoot】 什么是springboot(二)?springboot操作mybatisPlus、swagger、thymeleaf模板

文章目录 SpringBoot第三章1、整合mybatsPlus1-234-67-10问题 2、整合pageHelper分页3、MP代码生成器1、编写yml文件2、导入依赖3、创建mp代码生成器4、生成代码5、编写配置类扫描mapper类6、编写控制器类 4、swagger1、什么是swagger2、作用3、发展历程4、一个简单的swagger项…

ElastiCache Serverless for Redis应用场景和性能成本分析

一. 前言 传统基于实例节点的 Redis 缓存架构中&#xff0c;扩展性是一个重要影响因素。在很多场景中&#xff0c;例如广告投放、电商交易、游戏对战&#xff0c;流量是经常变化的。无论是主从还是集群模式&#xff0c;当大流量进入时&#xff0c;Redis 处理能力达到上限&…

“打工搬砖记”中吃什么的轮盘功能实现(二)

文章目录 打工搬砖记转盘主要的逻辑实现转盘的素材小结 打工搬砖记 先来一个吃什么轮盘的预览图&#xff0c;这轮盘文案加字呈圆形铺出来&#xff0c;开始后旋转到指定的选项处停下来。 已上线小程序“打工人搬砖记”&#xff0c;可以扫码进行预览观看。 转盘主要的逻辑实现…

如何使用Docker安装并运行Nexus容器结合内网穿透实现远程管理本地仓库

前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊如何使用Docker安装并运行Nexus容器结合内网穿透实现远程管理本地仓库&#xff0c;希望大家能觉得实用&#xff01; 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496…

openlayer实现ImageStatic扩展支持平铺Wrapx

地图平铺&#xff08;Tiling&#xff09;是地图服务中常见的技术&#xff0c;用于将大尺寸的地图数据分割成许多小块&#xff08;瓦片&#xff09;&#xff0c;便于高效加载和展示。这种技术特别适用于网络环境&#xff0c;因为它允许浏览器只加载当前视图窗口内所需的地图瓦片…

IT行业现状与未来趋势分析

IT行业现状与未来趋势显示出持续的活力和变革&#xff0c;以下是上大学网&#xff08;www.sdaxue.com&#xff09;关于IT行业现状与未来趋势分析&#xff0c;供大家参考。 当前现状&#xff1a; 市场需求持续增长&#xff1a;随着信息时代的深入发展&#xff0c;各行各业对信息…

LLM Agent智能体综述(超详细)

前言 &#x1f3c6;&#x1f3c6;&#x1f3c6;在上一篇文章中&#xff0c;我们介绍了如何部署MetaGPT到本地&#xff0c;获取OpenAI API Key并配置其开发环境&#xff0c;并通过一个开发小组的多Agent案例感受了智能体的强大&#xff0c;在本文中&#xff0c;我们将对AI Agent…

5G消息和5G阅信的释义与区别 | 赛邮科普

5G消息和5G阅信的释义与区别 | 赛邮科普 在 5G 技术全面普及的当下&#xff0c;历史悠久的短信服务也迎来了前所未有的变革。5G 阅信和 5G 消息就是应运而生的两种短信形态&#xff0c;为企业和消费者带来更加丰富的功能和更加优质的体验。 这两个产品名字和形态都比较接近&am…