热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java位运算之移位运算

文章目录移位运算左移位运算符无符号右移运算符移位运算移位运算符在程序设计中,是位操作运算符的一种。移位运算符可以在二进制的基础上对数字进行


文章目录

  • 移位运算
    • 左移 <<位运算符
    • 右移 >> 位运算符
    • 无符号右移 >>> 运算符


移位运算

移位运算符在程序设计中&#xff0c;是位操作运算符的一种。移位运算符可以在二进制的基础上对数字进行平移。移位运算符有左移 <<&#xff0c;右移 >>&#xff0c;无符号右移 >>> 这几种。


左移 <<位运算符

运算规则&#xff1a;按二进制形式把所有的数字向左移动对应的位数&#xff0c;高位移出(舍弃)&#xff0c;低位的空位补零。

首先来看它在 Java 中的使用&#xff1a;

int a &#61; 10;
System.out.print(a << 2);// 将变量a的二进制的值向左移动两位

执行结果&#xff1a;40

首先我们先将 a 的值转化为二进制的形式。

00000000000000000000000000001010 // a值的二进制
上面将变量 a 的二进制的值使用左移 <<位运算符向左移动两位&#xff0c;而根据它的使用规则可以看出&#xff0c;我们需要将最左边的两个数&#xff0c;也就是两个 0 给移除&#xff0c;后面的数字整体向左移两位&#xff0c;最右侧空出的两个位置用 0 补齐&#xff0c;那它的最后结果就应该是&#xff1a;

00000000000000000000000000001010 // a值的二进制
00000000000000000000000000101000 // 使用左移 <<位运算符向左移动两位后的二进制值
而 00000000000000000000000000101000 的十进制形式就是 40 。


右移 >> 位运算符

运算规则&#xff1a;按二进制形式把所有的数字向右移动对应位移位数&#xff0c;低位移出(舍弃)&#xff0c;高位的空位补符号位&#xff0c;即正数补零&#xff0c;负数补一。

首先来看它在 Java 中的使用&#xff1a;

int a &#61; -3;
System.out.print(a >> 2);// 将变量a的二进制的值向右移动两位

执行结果&#xff1a;-1

正负整数在 Java 中以二进制补码形式表示&#xff0c;a 的值为 -3&#xff0c;所以 a 的二进制形式为&#xff1a;

11111111111111111111111111111101 // a值的二进制
注意&#xff1a;负数最高位取1&#xff0c;正数取0&#xff0c;关于补码的相关知识可自行了解&#xff0c;本课程不负责讲解。

上面将变量 a 的二进制的值使用右移 >> 位运算符向右移动两位&#xff0c;而根据它的使用规则可以看出&#xff0c;我们需要将最后两位的两个数&#xff0c;也就是 0 和 1 给移除&#xff0c;前面的数字整体向后退两位&#xff0c;前面空出的两个位置用符号位补齐&#xff0c;也就是如果这个数是正数&#xff0c;就补 0&#xff0c;负数的话就补 1&#xff0c;而这里 a 的值为负数&#xff0c;那它的最后结果就应该是&#xff1a;

11111111111111111111111111111101 // a值的二进制
11111111111111111111111111111111 // 使用右移 >> 位运算符向右移动两位后的二进制值
11111111111111111111111111111111 的十进制形式是 -1&#xff0c;故 -3 右移两位的结果是 -1。


无符号右移 >>> 运算符

运算规则&#xff1a;与右移 >> 位运算符的移动方向相同&#xff0c;区别是在移动后空出的高为上补 0&#xff0c;即不考虑被移动整数的正负情况&#xff0c;只使用 0 进行补位。

首先来看它在 Java 中的使用&#xff1a;

int a &#61; -3;
System.out.print(a >>> 2);// 将变量a的二进制的值向右移动两位

执行结果&#xff1a;
1073741823

首先我们先将 a 的值转化为二进制的形式。

11111111111111111111111111111101 // a值的二进制
上面将变量 a 的二进制的值使用无符号右移 >>> 位运算符向右移动两位&#xff0c;而根据它的使用规则可以看出&#xff0c;我们需要将最后两位的两个数&#xff0c;也就是 0 和 1 给移除&#xff0c;前面的数字整体向后退两位&#xff0c;前面空出的两个位置用两个 0 补齐&#xff0c;那它的最后结果就应该是&#xff1a;

11111111111111111111111111111101 // a值的二进制
00111111111111111111111111111111 // 使用无符号右移 >>> 位运算符向右移动两位后的二进制值
而 00111111111111111111111111111111 的十进制形式就是 1073741823 。


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
author-avatar
Magic淘
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有