Java基础之原码,反码,补码,位运算符

文章目录

  • 前言
  • 一、二进制在运算中介绍
  • 二、原码,反码,补码(针对有符号的)
  • 三、位运算符
    • 按位与&
    • 按位或 |
    • 按位异或 ^
    • 按位取反 ~
    • 算术右移>>
    • 算术左移<<
    • 逻辑右移>>>
  • 总结


前言

原码,反码,补码对于Java程序员来说是一个重点,也是对于初学者来说的一个难点,这里我给出一些简单易懂的规律与介绍(适合快速入门)。本篇内容是跟位运算符一起讲解的,正好可以做一些位运算符的习题来掌握原码,反码,补码的内容,也便于较好理解位运算符。


一、二进制在运算中介绍

  1. 二进制是逢2进1位的进位制,0、1是基本算符。
  2. 现代的电子计算机技术全采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便,易于用电子实现。计算机内部处理的信息,都是采用二进制数来表示的。

二、原码,反码,补码(针对有符号的)

  1. 二进制的最高制位是符号位:0表示正数,1表示负数
  2. 正数(三码合一):原码,反码,补码都一样,均是该数的二进制数。
  3. 负数的反码:它的符号位不变,其他取反(0->1,1->0)。
  4. 负数的补码=它反码 +1,负数的反码=它补码 -1。
  5. 0的反码,补码都是0。
  6. java没有无符号数,换而言之,Java中的数都是有符号的。
  7. 在计算机运算的时候都是以补码的方式来运算的。(所以下面位运算符的运算都是先转为补码再操作)
  8. 运算结果还是要回归(转换)到原码。

三、位运算符

在讲述下面位运算符之前,我来解释一下高位,低位以,补位以及溢出这些词语的意思,方便大家更容易理解下面的内容。(右移为例(下面写错了,左移两位改为右移两位),如果看不懂就配合着下面7个位运算符的例子,大家就明白了)
概念通俗解释

Java有7个位运算符(&、|、^、~、>>、<<和>>>(特别注意没有<<<符号))

按位与&

两位全为1,结果是1,否则为0

		//2 & 3 = 22 的原码:00000000 00000000 00000000 0000010补码:00000000 00000000 00000000 0000010//正数三码一样3 的原码:00000000 00000000 00000000 0000011补码:00000000 00000000 00000000 0000011//正数三码一样2 & 300000000 00000000 00000000 0000001000000000 00000000 00000000 00000011     //对补码进行竖向操作,0&0=0,0&1=0,1&1=1-----------------------------------------00000000 00000000 00000000 00000010//结果是补码,要转为原码//正数三码一样,故还是这个=2

按位或 |

两位有一个为1,结果为1,否则为0

		//2 | 3 = 32 的原码:00000000 00000000 00000000 00000010补码:00000000 00000000 00000000 00000010//正数三码一样3 的原码:00000000 00000000 00000000 00000011补码:00000000 00000000 00000000 00000011//正数三码一样2 | 300000000 00000000 00000000 0000001000000000 00000000 00000000 00000011      //对补码进行竖向操作,0|0=0,1|1=1,0|1=1-----------------------------------------00000000 00000000 00000000 00000011//结果是补码,要转为原码//正数三码一样,故还是这个=3

按位异或 ^

两位一个为1,一个为0,结果为1,否则为0

//2 ^ 3 = 12 的原码:00000000 00000000 00000000 00000010补码:00000000 00000000 00000000 00000010//正数三码一样3 的原码:00000000 00000000 00000000 00000011补码:00000000 00000000 00000000 00000011//正数三码一样2 ^ 300000000 00000000 00000000 0000001000000000 00000000 00000000 00000011      //对两行补码进行竖向操作0^0=0,1^1=0,0^1=1-----------------------------------------00000000 00000000 00000000 00000001//结果是补码,要转为原码//正数三码一样,故还是这个=1

按位取反 ~

0->1,1->0

// ~ -2 = 1-2 的原码:10000000 00000000 00000000 00000010反码:11111111 11111111 11111111 11111101  补码: 11111111 11111111 11111111 11111102 //反码+1=>11111111 11111111 11111111 11111110//逢2进1~ -200000000 00000000 00000000 00000001   //对补码进行取反操作//结果是补码,要转为原码//最高位是0,为正数,三码一样=1

算术右移>>

低位溢出,符号位不变,并用符号位补溢出的高位。(本质:n>>m=n/2/2/…(除m个2))

		//1 >> 2 = 01 的原码:00000000 00000000 00000000 00000001补码: 00000000 00000000 00000000 00000001//正数三码一样1 >> 2:  00000000 00000000 00000000 00000000//对补码进行操作,整体右移两位,符号位补高位//结果是补码,要转为原码//最高位是0,为正数,三码一样==>0   //本质:1 >> 2 ==>1/2/2=0

算术左移<<

符号位不变,低位补零。 (本质:n>>m=n22*…(乘m个2))

		//1 << 2 = 41 的原码:00000000 00000000 00000000 00000001补码: 00000000 00000000 00000000 00000001//正数三码一样1 >> 2:  00000000 00000000 00000000 00000100//整体左移两位,低位补零//结果是补码,要转为原码//最高位是0,为正数,三码一样	==> 4  //本质:1 << 2 ==>1*2*2=4

逻辑右移>>>

低位溢出,高位补零。

		//4 >>> 2 =14的原码:00000000 00000000 00000100补码:00000000 00000000 00000100 4 >>> 2: 00000000 00000000 00000001//结果是补码,最高位是0,正数,三码一样,也是原码===> 1对于正数,逻辑右移跟算术右移是一样的----------------------------------------------------------------------而负数就不是这样,因为算术右移高位补符号位,所以正数补0,负数补1但是逻辑右移,高位均补0,这对正数没什么影响,但是对负数影响很大(因为补的高位由1变为0,即由正变负,转为原码时除符号位补的高位变成1)如 -2>>>2-2 的原码:10000000 00000000 00000000 00000010反码:11111111 11111111 11111111 11111101  补码: 11111111 11111111 11111111 11111102 //反码+1=>11111111 11111111 11111111 11111110//逢2进1-2>>>2:00111111 11111111 11111111 11111111  //整体右移两位,高位补0,结果是补码00111111 11111111 11111111 11111110  //转为反码01000000 00000000 00000000 00000001  //转为原码//注意此时高位有1,这就变成了一个很大的数==>2^30+2^0

上面算术右移的本质总结还不算太准确。就比如-2>>2= -1,按照本质的话-1/2/2=0,其实大家还是应该转换成补码去理解一下就懂了。

//这个本质不适用就是因为当它算术右移运算正好等于-1时(-n/2/2/...=-1),再右移多少位还是-1-1 的原码:10000000 00000000 00000000 00000001反码: 11111111 11111111 11111111 11111110补码: 11111111 11111111 11111111 11111111所以无论你再右移,按照算术右移规则:低位溢出,符号位不变,并用符号位补溢出的高位你的补码永远是11111111 11111111 11111111 11111111所以答案永远是 -1算术左移的本质总结是对的,大家可以用我上面的方法推导一下 

总结

原码,反码,补码是一个必要的基础,希望把基础打好,才能走得更长远,学到后面越轻松,虽然你目前不一定用到,但是很重要,希望大家一定要注重基础的筑建,一起加油。如果大家把我这篇文章仔细弄懂,大家对这些内容的掌握就已经可以了,不需要再深入了。

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

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

相关文章

Android Studio build.gradle获取项目绝对路径

通过这个字段 ${project.rootProject.projectDir}";如项目根build.gradle中&#xff1a; // Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {repositories {google()mavenCentral()// jcenter() // kee…

【预测爆款不用愁,有服饰RFID小助手】

时尚服饰行业库存成本高&#xff0c;数据不精准&#xff0c;爆款服饰一直抓不住&#xff0c;增加库存滞销风险难脱逃&#xff0c;给服饰零售企业带来极大困扰。 帮您提前预测爆款服饰小塔服饰RFID系统 小塔RFID系统作为服饰新零售小助手&#xff0c;通过RFID系统与硬件结合&a…

全新仿某度文库网站源码/在线文库源码/文档分享平台网站源码/仿某度文库PHP源码

源码简介&#xff1a; 全新仿某度文库网站源码/在线文库源码&#xff0c;是以phpMySQL开发的&#xff0c;它是仿某度文库PHP源码。有功能免费文库网站 文档分享平台 实现文档上传下载及在线预览。 仿百度文库是一个以phpMySQL进行开发的免费文库网站源码。仿某度文库实现文档…

项目:基于UDP的网络聊天室

项目需求&#xff1a; 1.如果有用户登录&#xff0c;其他用户可以收到这个人的登录信息 2.如果有人发送信息&#xff0c;其他用户可以收到这个人的群聊信息 3.如果有人下线&#xff0c;其他用户可以收到这个人的下线信息 4.服务器可以发送系统信息 服务器代码&#xff1a; #i…

Istio新架构揭秘:环境化Mesh

自问世以来&#xff0c;Istio因其使用Sidecar&#xff08;可编程代理与应用容器一同部署&#xff09;而备受认可。这种架构选择使Istio用户能够享受其好处&#xff0c;而无需对其应用进行 drast 改变。这些可编程代理&#xff0c;与应用容器紧密部署在一起&#xff0c;因其能够…

计算机网络 一到二章 PPT 复习

啥币老师要隔段时间测试&#xff0c;我只能说坐胡狗吧旁边 第一章 这nm真的会考&#xff0c;我是绷不住的 这nm有五种&#xff0c;我一直以为只有三种 广播帧在后面的学习中经常遇到 虽然老师在上课的过程中并没有太过强调TCP/IP的连接和断开&#xff0c;但我必须强调一下&…

Rust之构建命令行程序(一):接受命令行参数

开发环境 Windows 10Rust 1.73.0 VS Code 1.84.2 项目工程 这次创建了新的工程minigrep. IO工程&#xff1a;构建命令行程序 这一章回顾了到目前为止你所学的许多技能&#xff0c;并探索了一些更标准的库特性。我们将构建一个与文件和命令行输入/输出交互的命令行工具&#…

西南科技大学数字电子技术实验二(SSI逻辑器件设计组合逻辑电路及FPGA实现 )FPGA部分

一、实验目的 1、掌握用SSI(小规模集成电路)逻辑器件设计组合电路的方法。 2、掌握组合逻辑电路的调试方法。 3、学会分析和解决实验中遇到的问题。 4、学会用FPGA实现本实验内容。 二、实验原理 包括:原理图绘制和实验原理简述 1、1位半加器 2、1位全加器 3、三…

HarmonyOS 后台任务管理开发指南上线!

为什么要使用后台任务&#xff1f;开发过程中如何选择合适的后台任务&#xff1f;后台任务申请时存在哪些约束与限制&#xff1f; 针对开发者使用后台任务中的疑问&#xff0c;我们上线了概念更明确、逻辑结构更清晰的后台任务开发指南&#xff0c;包含具体的使用场景、详细的开…

4、stable diffusion

github 安装anaconda环境 conda env create -f environment.yaml conda activate ldm安装依赖 conda install pytorch1.12.1 torchvision0.13.1 torchaudio0.12.1 cudatoolkit11.3 -c pytorch pip install transformers4.19.2 diffusers invisible-watermark pip install -e…

ELK+Filebeat

Filebeat概述 1.Filebeat简介 Filebeat是一款轻量级的日志收集工具&#xff0c;可以在非JAVA环境下运行。 因此&#xff0c;Filebeat常被用在非JAVAf的服务器上用于替代Logstash&#xff0c;收集日志信息。实际上&#xff0c;Filebeat几乎可以起到与Logstash相同的作用&…

社区团购小程序源码系统 带会员功能+会员积分+会员分组+会员等级 附带部署与搭建的完整教程

社区团购小程序源码系统是一种基于微信小程序的电商系统&#xff0c;它通过社交电商模式&#xff0c;将社区居民、商家和平台紧密结合&#xff0c;实现便捷的线上购物和线下社区服务。该系统支持会员功能、会员积分、会员分组和会员等级等功能&#xff0c;为用户提供更加个性化…