Java中的<<、>>、>>>运算符

二进制中的原码、反码、补码

有符号数:

对于有符号数而言,符号的正、负机器是无法识别的,但由于“正、负”恰好是两种截然不同的状态,如果用“0”表示“正”,用“1”表示“负”,这样符号也被数字化了,并且规定将它放在有效数字的前面,即组成了有符号数。所以,在二进制中使用最高位(第一位)来表示符号,最高位是0,表示正数;最高位是1,表示负数。

100000000000000001111100

无符号数:

无符号数是针对二进制来讲的,无符号数的表数范围是非负数。全部二进制均代表数值(所有位都用于表示数的大小),没有符号位。即第一个"0"或"1"不表示正负

000000000000000001111100

对于有符号数而言的性质:

(1)二进制的最高位是符号位:0表示正数,1表示负数

(2)正数的原码、反码、补码都一样

(3)负数的反码 = 它的原码符号位不变,其他位取反(0 ->1 ; 1->0 )

(4)负数的补码 = 它的反码 +1

(5)0的反码、补码都是0

(6)在计算机运算的时候,都是以补码的方式来运算的

有符号数运算案例

  1. 正数相加:

例如:1+1 ,在计算机中运算如下:

1的原码为: 00000000 00000000 00000000 00000001

反码: 00000000 00000000 00000000 00000001

补码: 00000000 00000000 00000000 00000001

两数的补码相加: 00000000 00000000 00000000 00000010( 转换为10进制) = 2

  1. 正数相减:

例如:1 - 2,在计算机中运算如下:

在计算机中减运算其实是作为加运算来操作的,所以,1-2 = 1 + ( -2 )

  • 第一步:获取1的补码 00000000 00000000 00000000 00000001
  • 第二步:获取-2的补码

-2的原码:10000000 00000000 00000000 00000010

-2的反码:11111111 11111111 11111111 11111101

-2的补码: 11111111 11111111 11111111 11111110

  • 第三步:1的补码与-2的补码相加:

    00000000 00000000 00000000 00000001

+ 11111111 11111111 11111111 11111110

= 11111111 11111111 11111111 11111111

  • 第四步:将计算结果的补码转换为原码,反其道而行之即可(如果想将二进制转换为十进制,必须得到二进制的原码)

补码:11111111 11111111 11111111 11111111

=

反码:11111111 11111111 11111111 11111110

=

原码:10000000 00000000 00000000 00000001

第五步:将计算结果的二进制原码 转换 为十进制

二进制原码:10000000 00000000 00000000 00000001 = -1

<< 、>>、>>> 位移运算符

<< 左移运算符

左移一位

你真的搞懂了Java中的<<、>>、>>>运算符嘛?_运算符

左移一位后的数值经过计算可以发现刚好值位移前数值的两倍,等价于乘2操作,在很多情况下可以当做乘2使用,但是并不代表真正的乘2,在一些特殊情况下并不等价

左移18位

你真的搞懂了Java中的<<、>>、>>>运算符嘛?_运算符_02

此时二进制首位为1,此时数值为 -1058799616,同理,如果左位移20位,则值为 59768832 又变成了正数

注意:所以根据这个规则,如果任意一个十进制的数左位移32位,右边补位32个0,十进制岂不是都是0了?当然不是!!! 当int 类型的数据进行左移的时候,当左移的位数大于等于32位的时候,位数会先求余数,然后用该余数进行左移,也就是说,如果真的左移32位的时候,会先进行位数求余数,即为左移32位相当于左移0位 ,所以左移 33 的值和左移一位1 是一样的

>> 右移运算符

100 带符号右移

100 源码补码均为:00000000 00000000 00000000 01100100

右移四位: 00000000 00000000 00000000 00000110

结果为:6

-100 带符号右移

-100原码: 10000000 00000000 00000000 01100100

-100补码: 保证符号位不变,其余位置取反并加1

​ 11111111 11111111 11111111 10011100

右移4位 : 在高位补1

​ 11111111 11111111 11111111 11111001

补码形式的移位完成后,结果不是移位后的结果,还需要进行变换才行。其方法如下:

保留符号位,然后按位取反: 10000000 00000000 00000000 00000110

然后加1,即为所求数的原码: 10000000 00000000 00000000 00000111

结果为:-7

>>> 无符号右移运算符

无符号右移运算符和右移运算符是一样的,不过无符号右移运算符在右移的时候是补0的,而右移运算符是补符号位的

100 无符号右移 4 位

100 源码补码均为:00000000 00000000 00000000 01100100

右移四位: 00000000 00000000 00000000 00000110

结果为:6

-100无符号右移4位

-100原码: 10000000 00000000 00000000 01100100

-100补码: 保证符号位不变,其余位置取反并加1

​ 11111111 11111111 11111111 10011100

无符号右移4位 : 在高位补0

​ 00001111 11111111 11111111 11111001

结果为:268435449

总结:正数的左移与右移、无符号右移、负数的无符号右移,就是相应的补码移位所得,在高位补0即可

负数的右移,就是补码高位补1,然后按位取反加1即可

>> 运算符

右移运算符 
右移运算符>>使指定值的所有位都右移规定的次数。 
1)它的通用格式如下所示: 
value >> num 
num 指定要移位值value 移动的位数。 
右移的规则只记住一点:符号位不变,左边补上符号位 2)运算规则: 
按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1 
当右移的运算数是byteshort类型时,将自动把这些类型扩大为 int 型。 
例如,如果要移走的值为负数,每一次右移都在左边补1,如果要移走的值为正数,每一次右移都在左边补0,这叫做符号位扩展(保留符号位)(sign extension ),在进行右移 操作时用来保持负数的符号。 3)数学意义 
右移一位相当于除2,右移n位相当于除以2的n次方。 4)计算过程 
11 >>2(11int) 
1)11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011 
2)把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。 
3)最终结果是0000 0000 0000 0000 0000 0000 0000 0010。 
转换为十进制是335 >> 2(35int) 
35转换为二进制:0000 0000 0000 0000 0000 0000 0010 0011 
把低位的最后两个数字移出:0000 0000 0000 0000 0000 0000 0000 1000 
转换为十进制: 8 5)在右移时不保留符号的出来 
右移后的值与0x0f进行按位与运算,这样可以舍弃任何的符号位扩展,以便得到的值可以作为定义数组的下标,从而得到对应数组元素代表的十六进制字符。 
例如 
Java代码 
public class HexByte {public static public void main(String args[]) {char hex[] = {'0', '1', '2', '3', '4', '5', '6', '7','8', '9', 'a', 'b', 'c', 'd', 'e', 'f'' };byte b = (byte) 0xf1;System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);}
} 
(b >> 4) & 0x0f的运算过程: 
b的二进制形式为:1111 0001 
4位数字被移出:0000 1111 
按位与运算:0000 1111 
转为10进制形式为:15 
b & 0x0f的运算过程: 
b的二进制形式为:1111 0001 
0x0f的二进制形式为:0000 1111 
按位与运算:0000 0001 
转为10进制形式为:1 
所以,该程序的输出如下: 
b = 0xf1

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

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

相关文章

actionscript 3.0 怎么写android 程序,(ActionScript3.0笔记)第一个程序HelloWorld!

(ActionScript3.0笔记)第一个程序HelloWorld!创建我的第一个ActionScript3.0程序--HelloWord&#xff01;首先下载ActionScript3.0的集成开发环境&#xff0c;FLASH CS4 Professional。从网站下载FLASH CS4 Professional软件的安装包程序&#xff0c;下载好后进行安装。安装后在…

android.app.activityview,ViewModel 概览

ViewModel 概览ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。注意&#xff1a;如需将 ViewModel导入 Android 项目&#xff0c;请参阅 Lifecycle 版本说明中关于声明依赖项的说明。Android 框架可…

使用Navicat将数据从Excel导入到MySQL数据库

数据库中的表已经建好了&#xff0c;现在要将数据从Excel导入 要求&#xff1a;Excel中要有一行为字段名&#xff08;可以与数据表中的字段名顺序不一样&#xff09; 具体步骤 1、右键单击表&#xff0c;选择 导入向导 2、选择数据导入格式&#xff0c;然后点击下一步 3…

html5 a-z字母排序,Mint UI实现A-Z字母排序的城市选择列表

本文实例为大家分享了Mint Ul实现A-Z字母排序的城市选择列表的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下效果图如下&#xff1a;项目文件存放路径图&#xff1a;所有代码如下&#xff1a;import city from "../assets/json/city"//导入所有城市的JSON…

Geometry几何结构与WKT空间坐标计算缓冲距离模型构建

geometry&#xff0c;英语单词&#xff0c;名词&#xff0c;意思是“几何学几何结构”。 http://www.baike.com/wiki/WKTWKT&#xff0c;是一种文本标记语言&#xff0c;用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。它的二进制表示方式&#xff0c;亦即WKB(…

html5开发之ios屏幕适配,iOS开发屏幕尺寸以及屏幕适配等问题(转载内容)

原帖地址&#xff1a;http://blog.csdn.net/phunxm/article/details/42174937/仅供我个人收藏学习&#xff0c;原博主如不同意请联系qq651263878进行删除&#xff0c;在此表示感谢以及歉意。1.iPhone尺寸规格后续上市的iPhone7以及iPhone7plus 与六代相同1 inch 2.54cm 25.4…

flink checkpoint 恢复_Flink解析 | Apache Flink结合Kafka构建端到端的ExactlyOnce处理

周凯波(宝牛)阿里巴巴技术专家&#xff0c;四川大学硕士&#xff0c;2010年毕业后加入阿里搜索事业部&#xff0c;从事搜索离线平台的研发工作&#xff0c;参与将搜索后台数据处理架构从MapReduce到Flink的重构。目前在阿里计算平台事业部&#xff0c;专注于基于Flink的一站式计…

Java通过ftl模板导出word最详细教程

首先用office建一个word文档 参数写自己查询出来的字段&#xff0c;我在这里房里图片是方便找到位置替换为64位编码 模板创建好之后&#xff0c;另存为Word 2003 XML文档(*.xml) 存储为别的可能会报错&#xff0c;我只用这一种 存储为xml之后千万不要用word打开&#xff0c;最…

封装html ui 控件,聊聊前端 UI 组件:组件设计

本文首发于欧雷流。由于我会时不时对文章进行补充、修正和润色&#xff0c;为了保证所看到的是最新版本&#xff0c;请阅读原文。在本系列文章《聊聊前端 UI 组件&#xff1a;组件体系》中初步说明了 UI 组件的架构设计&#xff0c;本文将在此基础上进一步展开说说那篇文章中一…

live555推流rtsp_Hi3518 RTSP推流

1、openssl编译下载地址:http://distfiles.macports.org/openssl/解压后进入源码根路径执行./config no-asm no-async --prefix/home/chenyc/project/hi3518e/Hi3518E_SDK_V1.0.3.0/armlib/openssl --cross-compile-prefixarm-hisiv300-linux-#打开生成的makefile 删除-m64 在…

怎么两边同时取ln_男生“两边铲光”发型out了?试试这4款吧,剪完清爽又帅气...

发型对于男生来说是特别重要的&#xff01;女生可以通过化妆来让自己变得更完美&#xff0c;而男生想要改变自己的形象&#xff0c;是不敢轻易化妆的&#xff0c;只有通过改变自己的发型&#xff0c;才能更好地展现自己的魅力。现下男生最流行的发型&#xff0c;莫过于“两边铲…

ionic 修改组件默认样式_开源Magpie:组件库详解

开源项目专题系列(八)1.开源项目名称&#xff1a;magpie_fly2.github地址&#xff1a;https://github.com/wuba/magpie_fly3.简介&#xff1a;magpie_fly 是58集体出品组件库&#xff0c;统一管理日常开发中的基础组件及高阶组件&#xff0c;并提供了相对友好的方式介绍组件的具…

口袋之旅html5超强账号,口袋之旅特攻排行榜 强大的绝对能力

历史上是在金银版分了精灵的特攻物攻&#xff0c;在宝石版分了技能的特攻物攻&#xff0c;让很多精灵和技能得以重生。口袋之旅采用的是第二世代的精灵加第三世代的技能分类&#xff0c;于是特攻手也成为了一个需要挑选的部分&#xff0c;本文继续为你缩小挑选范围。特攻种族值…

使用ftl生成word

背景&#xff1a;根据word模板下载word。word里面需要填充数据&#xff0c;格式是固定的。首先在word中给数据起个变量名称 需要更换的数据改成${变量名!}&#xff0c;必须是英文的&#xff0c;加感叹号是为了防止null&#xff0c;如果数据是null&#xff0c;文档下载下来后会直…

什么叫做项目孵化_蓝莓孵化营12进5争夺战,项目人绽放自我不留遗憾

国内首档互联网职业竞技励志节目《蓝莓孵化营》&#xff0c;今晚22点在浙江卫视播出第十一期。本期节目中&#xff0c;第三事业群的12组项目人将为最终的5张终极考核入场券展开争夺。这一次&#xff0c;他们比拼的是以“2020”为主题的短视频&#xff0c;每一组项目人都拼尽了自…

一开机就提示脱机工作_「华为手机维修自学教程」华为手机的开机触发电路 华为维修技巧...

谈谈华为的开机触发电路华为这段时间的新闻不少&#xff0c;大家应该都有说了解。华为的强大意味着华为手机的维修市场越来越大。从事维修的朋友们你们准备好了吗&#xff1f;今天给大家说一说&#xff0c;华为手机的开机触发电路。修苹果手机的朋友大家都知道&#xff0c;电源…

SpringBoot 整合mybatis-plus 高级功能及用法详解

springboot 整合mybatis-plus 高级功能及用法详解 学习并使用mybatis-plus的一些高级功能的用法例如&#xff1a; AR模式、 乐观锁 、逻辑删除 、自动填充、数据保护等功能 为了方便演示&#xff0c;咱们还是新建一个全新的项目 引入mp依赖 <dependency><groupId>…

8除以2表示什么意思_八字中劫财,比肩分别表示什么意思

◆◆比劫与其他十神的生克关系◆◆食伤&#xff1a;比劫生食伤财星&#xff1a;比劫克财星官星&#xff1a;官星克比劫印星&#xff1a;印星生比劫◆◆比劫帮身◆◆八字术语&#xff0c;比肩劫财均可助日干之力&#xff0c;如甲见甲(比)、乙(劫)、寅(禄)、卯(刃)之类&#xff0…

MyBatis-plus 自动填充MetaObjectHandler不生效问题

背景 在项目中经常遇到一些数据需要自动填充&#xff0c;填充方法都是同一种规则&#xff0c;例如创建时间等。 1 自动填充方法配置 1.1 实体类添加注解 1.2 在handler包下实现元对象处理器接口 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import o…

博途变量类型_PLC数据类型(UDT)

UDT类型是一种由多个不同数据类型元素组成的数据结构&#xff0c;元素可以是基本数据类型&#xff0c;也可以是STRUCT、数组等复杂数据类型以及其它UDT等。UDT类型嵌套UDT类型的深度限制为 8 级。UDT类型可以在DB、OB/FC/FB接口区处使用。从TIA 博途 V13SP1 开始&#xff0c;S7…