java中的左移、右移、无符号右移

简介: 阅读java源码会经常碰到左移与右移运算。那么左移与右移都是怎么运算呢?查询资料学习了下,这里做个总结。

前言:

阅读java源码会经常碰到左移与右移运算。那么左移与右移都是怎么运算呢?查询资料学习了下,这里做个总结。


一.左移 (<<)



直接举个例

20210401230825412.gif


图中测试结果我们可以看到

1<<2=4;

1<<3=8;


是不是发现规律了?没错规律就是左移几位就是乘以2的几次方

一个数左移几位的结果就是,这个数乘以2的几次方的值。


补充说明:


左移无论是正数还是负数计算规则都是一样的,就像上面所说,用官方的话来说就叫:高位向左移动,低位补零。


二.右移(>>)



左移的结果是一个数乘以2的n次方,那右移是一个数除以2的n次方吗?其实不是,这么记是不对的,应该将这个数转化为2进制数,然后将这个数向右移动。这么计算才是准确的(左移右移原理都一样,只是向右移动特殊),符号位不变。

比如2进制的数13,:
0000 0000 0000 0000 0000 0000 0000 1101
对13进行右移2位 :13>>2
0000 0000 0000 0000 0000 0000 0000 0011
所以 13>>2=3;


发现规律了吧,就是将低位右移,高位补零,符号位不变。这就是右移运算的规律。


补充说明:

无论是左移还是右移都不会改变原始数据的符号。但是右移移多了就是0了。右移不可以简单的记忆成除以2的几次方,这么记是不对的。


三.无符号右移(>>>)



已经知道,左移与右移都不会改变数据的正负号,但是无符号右移(>>>)则会。

举个例子看下右移与无符号右移的区别:
13>>>2=3
-13>>>2=1073741820


总结:


正数的无符号右移:与右移规则一致。

负数的无符号右移:这个就有点麻烦了,需要先将负数取反,得到反码,然后反码加1得到补码,补码再进行右移,这样得到的结果就是无符号右移的结果了。


相关文章
|
5天前
|
Java
java:找不到符号
这篇文章讨论了Java编程中常见的错误信息 "找不到符号:类 entity",并提供了解决这个问题的一些方法和建议。
|
1天前
|
Java
成功解决:java: 找不到符号 符号: 方法 getSort() 位置: 类型为com.atguigu.gulimall.product.entity.CategoryEntity的变量 menu1
这篇文章讨论了Java中遇到的一个常见错误:"java: 找不到符号 符号: 方法 getSort() 位置: 类型为com.atguigu.gulimall.product.entity.CategoryEntity的变量 menu1",即在尝试调用一个不存在的方法时出现的问题,并提供了相应的解决方法。
|
2月前
|
Java
JAVA工具类匹配重复或者连续的字符和符号
JAVA工具类匹配重复或者连续的字符和符号
25 2
|
2月前
|
Java
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
27 3
|
2月前
|
Java
Java中的左移运算符及其在实现加法效果上的应用
Java中的左移运算符及其在实现加法效果上的应用
17 0
|
3月前
|
Java Kotlin
java调用kotlin代码编译报错“找不到符号”的问题
java调用kotlin代码编译报错“找不到符号”的问题
156 10
|
3月前
|
Java
java判断字符串中有多少数字字母或者符号
java判断字符串中有多少数字字母或者符号
|
7天前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
30 7
|
6天前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
6天前
|
存储 监控 安全
一天十道Java面试题----第三天(对线程安全的理解------>线程池中阻塞队列的作用)
这篇文章是Java面试第三天的笔记,讨论了线程安全、Thread与Runnable的区别、守护线程、ThreadLocal原理及内存泄漏问题、并发并行串行的概念、并发三大特性、线程池的使用原因和解释、线程池处理流程,以及线程池中阻塞队列的作用和设计考虑。