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.mzph.cn/news/181177.shtml

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

相关文章

【shell】文本三剑客之sed详解

目录 一、sed简介&#xff08;行编辑器&#xff09; 二、基本用法 三、sed脚本格式&#xff08;匹配地址 脚本命令&#xff09; 1、不给地址&#xff0c;那么就是针对全文处理 2、单地址&#xff0c;表示#&#xff0c;指定的行&#xff0c;$表示最后一行&#xff0c;/pattt…

牛客算法题 HJ100 等差数列 golang语言实现

算法题目 HJ100 等差数列 描述 等差数列 2&#xff0c;5&#xff0c;8&#xff0c;11&#xff0c;14。。。。 &#xff08;从 2 开始的 3 为公差的等差数列&#xff09; 输出求等差数列前n项和数据范围&#xff1a; 1 ≤ &#xfffd; ≤ 10001≤n≤1000 输入描述&#xff…

python与机器学习1,机器学习的一些基础知识概述(完善ing)

目录 1 AI ,ML,DL,NN 等等概念分类 1.1 人工智能、机器学习、深度学习、神经网络之间的关系&#xff1a; 1.2 人工智能的发展 2 ML机器学习的分类&#xff1a;SL, USL,RL 2.1 机器学习的分类 2.2 具体的应用举例 2.3 数据分类 3 关于阈值θ和偏移量b的由来 4 不同的激…

网站定制开发对企业的好处|软件app小程序搭建

网站定制开发对企业的好处|软件app小程序搭建 在当今数字化的时代&#xff0c;拥有一个专属于自己企业的网站已经成为了一种趋势。而与此同时&#xff0c;网站定制开发作为一种针对企业需求量身定制的解决方案&#xff0c;也越来越受到企业的关注和青睐。那么&#xff0c;网站定…

SSL证书实惠品牌——JoySSL

随着互联网的普及和发展&#xff0c;网络安全问题日益严重。为了保护网站数据的安全&#xff0c;越来越多的网站开始使用SSL证书。JoySSL证书作为一款高性价比的SSL证书&#xff0c;受到了广泛的关注和好评。 目前市面上主流的证书基本上都是国外证书&#xff0c;也就是说你在验…

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

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

js实现鼠标拖拽

目录 css代码 html代码 js代码 完整代码 效果图&#xff1a; 需求&#xff1a; 鼠标在图片内按下时 图片可以跟随盒子动 鼠标弹起图片停下来 如果图片在box的盒子里面时鼠标弹起了 就把图片展示在box里面 并且让图片回到起始位置 css代码 .div {width: 100px;height: 10…

五分钟 k8s 实战-应用探针

Probe.png 今天进入 kubernetes 的运维部分&#xff08;并不是运维 kubernetes&#xff0c;而是运维应用&#xff09;&#xff0c;其实日常我们大部分使用 kubernetes 的功能就是以往运维的工作&#xff0c;现在云原生将运维和研发关系变得更紧密了。 今天主要讲解 Probe 探针相…

C语言——I /深入理解指针(三)

一、字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* ; ⼀般使⽤: int main() { char ch w; char *pc &ch; *pc w; return 0; } 还有⼀种使⽤⽅式如下&#xff1a; int main() { const char* pstr "hello bit.";//这⾥是把⼀个字…

jquery 地址四级联级显示 不默认选择

代码效果 <body class"bgca"><img src"./files/joinTooBg.png" style"width: 100%;object-fit: cover;" alt""><!--填写申请资料--><section><div class"zi-liao"><h3 class"zong-h…

鸿蒙应用开发之打包与上架

一、概述 当您开发、调试完HarmonyOS应用/元服务&#xff0c;就可以前往AppGallery Connect申请上架&#xff0c;华为审核通过后&#xff0c;用户即可在华为应用市场获取您的HarmonyOS应用/元服务。 HarmonyOS会通过数字证书与Profile文件等签名信息来保证应用的完整性&#…

Vue3中props传参(多种数据类型传参方式)

在Vue3中&#xff0c;props接收的type类型有以下几种&#xff1a; 1. String&#xff1a;字符串类型 2. Number&#xff1a;数字类型 3. Boolean&#xff1a;布尔类型 4. Array&#xff1a;数组类型 5. Object&#xff1a;对象类型 6. Date&#xff1a;日期类型 7. Func…

第二证券:燃料电池产业进入发展快车道 多家公司披露布局进展

据悉&#xff0c;日前太原钢铁&#xff08;集团&#xff09;有限公司初次开发出超级超纯铁素体TFC22-X连接体材料并结束了批量供货&#xff0c;填补了国内空白。 燃料电池电堆连接体材料是行业中最为要害的战略材料。研发团队打破了特别元素含量精确操控的要害技术瓶颈&#x…

【智能算法】基于黄金正弦和混沌映射思想的改进减法优化器算法

减法优化器&#xff08;Subtraction-Average-Based Optimizer&#xff0c;SABO&#xff09;是2023年刚出的智能优化算法。目前知网中文期刊基本搜不到&#xff0c;并且可以遇见未来一年文章也很少。SABO算法原理简单&#xff0c;算上初始化粒子&#xff0c;总共不超过6个公式。…

AI 学习笔记(持续更新)

What is AI PS &#xff1a;代码块里的统一是 gpt4 回复 在大模型中 1 b 10 亿参数的含义 AI 目前是什么&#xff1f; 目前的人工智能&#xff08;AI&#xff09;是指使计算机和机器能够模仿人类智能的技术&#xff0c;包括学习、推理、解决问题、知觉、语言理解等能力。A…

【论文阅读笔记】Prompt-to-Prompt Image Editing with Cross-Attention Control

【论文阅读笔记】Prompt-to-Prompt Image Editing with Cross-Attention Control 个人理解思考基本信息摘要背景挑战方法结果 引言方法论结果讨论引用 个人理解 通过将caption的注意力图注入到目标caption注意力中影响去噪过程以一种直观和便于理解的形式通过修改交叉注意力的…

界限与不动产测绘乙级申请条件

整理一期关于测绘资质界限与不动产测绘乙级资质的申请要求 测绘资质是由测绘资质主管部门自然资源部制定的 想要了解标准、正规的申请条件&#xff0c;可以到当地省份的政务网搜索测绘资质办理相关标准&#xff08;例如下图&#xff09; 1、通用标准 http://gi.mnr.gov.cn/20…

基于多模态大数据的国家安全风险态势感知模型构建

源自&#xff1a;情报杂志 “人工智能技术与咨询” 发布 摘要 [研究目的]为强化国家安全情报能力,推动风险监测预警能力提升,构建基于多模态大数据的国家安全风 险态势感知模型。 [研究方法]首先,对国家安全风险态势感知进行阐释;然后,分析多模态大数据驱动下…

【黑马甄选离线数仓day07_常见优化手段及核销主题域开发】

1.常见优化手段 1.1 分桶表基本介绍 分桶表: 分文件的, 在创建表的时候, 指定分桶字段, 并设置分多少个桶, 在添加数据的时候, hive会根据设置分桶字段, 将数据划分到N个桶(文件)中, 默认情况采用HASH分桶方案 , 分多少个桶, 取决于建表的时候, 设置分桶数量, 分了多少个桶最终…

每日一题:LeetCode-202.面试题 08.06. 汉诺塔问题

每日一题系列&#xff08;day 07&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…