Java中左移和右移问题图文详解
作者:CLAY超 发布时间:2023-02-14 15:44:05
1 原码、反码、补码
原码:将十进制转化为二进制即原码;
反码:正数的反码与原码相同,负数的反码(除却最高位的符号位不变)与原码相反;
补码:正数的补码与原码相同,负数的补码(除却最高位的符号位不变)与原码的取反加一。
举例:5 和 -5
5:
原码:0 0000000 00000000 00000000 00000101
反码:0 0000000 00000000 00000000 00000101
补码:0 0000000 00000000 00000000 00000101
-5:
原码:1 00000000 00000000 00000000 00000101
反码:1 1111111 11111111 11111111 11111010
补码:1 1111111 11111111 11111111 11111011
2 位移操作
我们需要知道将一个数字,在计算机中进行移动多少位,例如8<<1代表将8转化为二进制在计算机中左移1位,低位补零;
<<:左移:低位补0
>>:有符号右移:正数高位补0,负数高位补1
>>>:无符号右移,高位补零
为什么没有无符号左移呢?因为左移的情况下只存在补零的情况。
举例 :5 和 -5
5<<1
原码:0 0000000 00000000 00000000 00000101
左移1位:0 0000000 00000000 00000000 00001010
即:10
-5<<1
原码:1 00000000 00000000 00000000 00000101
补码:1 1111111 11111111 11111111 11111011
左移1位:1 1111111 11111111 11111111 11110110
取其补码:1 0000000 00000000 00000000 00001010
即:-10
5>>1
原码:0 0000000 00000000 00000000 00000101
右移1位:0 0000000 00000000 00000000 00000010
即:2
-5>>1
原码:1 00000000 00000000 00000000 00000101
补码:1 1111111 11111111 11111111 11111011
右移1位:1 1111111 11111111 11111111 11111101
取其补码:1 0000000 00000000 00000000 00000011
即:-3
5>>>1:与5>>1一样,都是高位补0
原码:0 0000000 00000000 00000000 00000101
右移1位:0 0000000 00000000 00000000 00000010
即:2
-5>>>1
原码:1 00000000 00000000 00000000 00000101
补码:1 1111111 11111111 11111111 11111011
右移1位:0 1111111 11111111 11111111 11111101
即:2147483645
代码运行截图
总结:
位移操作很简单,使用补码移动,补齐空缺位就行,除了>>:补与最高位一致的;其他移动哪缺哪补零。
在java中无论截图中的a定义成 byte,short,int哪一种类型,它默认都是使用int类型(4字节32位),你使用long(8字节64位)
3 补充操作符
~(按位非):
逐位取反
|(按位或):
一真为真
1|0=1,
0|0=0,
1|1=1,
0|1=1
&(按位与):
两真为真
1|0=0,
0|0=0,
1&1=1;
0&1=0
^(按位异或):
相异为真
1^1=0
1^0=1
0^1=1
0^0=0.
来源:https://blog.csdn.net/wxc1207/article/details/121443523


猜你喜欢
- 实际开发中我们需要很多情况需要判断某个activity是否位于栈顶,也许会给新的小伙伴带来困扰,那么直接上代码吧,也没几行/** * *
- 目录I. 项目环境1. 项目依赖II. 缓存注解介绍1. @Cacheable2. @CachePut3. @CacheEvict4. @C
- 前言Mybatis真正强大的地方在于SQL映射语句,这也是它的魅力所在。相对于它强大的功能,SQL映射文件的配置却非常简单,我上篇文章语句讲
- 目录前言RenderObject 类继承层级解析RenderBox叶节点与父节点控件的测量与布局performResize 和 perfor
- Mybatis的Dao层实现传统开发方式编写UserDao接口public interface UserDao {  
- Android的设置界面实现比较简单,有时甚至只需要使用一个简单的xml文件即可.声明简单,但是如何从PreferenceScreen或者P
- itext生成PDF设置页眉页脚的实例详解实例代码:/** * ITextTest * iText生成PDF加入列表,注释等内容,同时设
- 本文实例讲述了Android开发实现模仿微信小窗口功能。分享给大家供大家参考,具体如下:运用方法:将显示窗口的风格 设置为对话框风格即可具体
- Java的反射机制允许我们对一个类的加载、实例化、调用方法、操作属性的时期改为在运行期进行,这大大提高了代码的灵活度。但在运行期进行反射操作
- 实例如下:public class CustomScrollView extends ScrollView {private Gesture
-   利用 springboot + redis 实现过滤重复提交的请求,业务流程如下所示,首先定义一个拦
- // 十进制转化为十六进制,结果为C8。 Integer.toHexString(200); //十六进制转化为十进制,
- 1. 什么是XGBoostXGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,被广
- 本文实例讲述了C#控件闪烁的解决方法。分享给大家供大家参考。具体分析如下:如果你在Form中绘图的话,不论是不是采用的双缓存,都会看到图片在
- 目录前言继承Thread实现Runnale接口Callable线程池常见的4种线程池。总结前言在java中,如果每个请求到达就创建一个新线程
- C++在vscode中的多文件编程相信有很多的小伙伴在一开始的时候,都会对vscode的多文件编程有很多的疑问,网上也有很多的教学,不过网上
- 背景SpringBoot的应用监控方案比较多,SpringBoot+Prometheus+Grafana是目前比较常用的方案之一。它们三者之
- 近日工程中,逐渐感觉到原来复制粘贴代码的笨重,突然想起以前有人和我说起过Git和SVN之类的版本管理工具。由于平时主要是写Java代码,所以
- 一.背景介绍:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffma
- 彩色图片转为灰度图的公式如下:gray(i,j) = 0.299 * Red(i,j)+0.587*Green(i,j)+0.114*Blu