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

news2024/11/28 17:46:26

文章目录

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


前言

原码,反码,补码对于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 = 2
		2 的原码:00000000 00000000 00000000 0000010
		   补码:00000000 00000000 00000000 0000010//正数三码一样
		3 的原码:00000000 00000000 00000000 0000011
		   补码:00000000 00000000 00000000 0000011//正数三码一样
	2 & 300000000 00000000 00000000 00000010
	        00000000 00000000 00000000 00000011     //对补码进行竖向操作,0&0=0,0&1=0,1&1=1
	      -----------------------------------------
	      	00000000 00000000 00000000 00000010//结果是补码,要转为原码
	      										//正数三码一样,故还是这个
	      	=2

按位或 |

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

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

按位异或 ^

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

//2 ^ 3 = 1
		2 的原码:00000000 00000000 00000000 00000010
		   补码:00000000 00000000 00000000 00000010//正数三码一样
		3 的原码:00000000 00000000 00000000 00000011
		   补码:00000000 00000000 00000000 00000011//正数三码一样
	2 ^ 300000000 00000000 00000000 00000010
	        00000000 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 = 0
		1 的原码: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 = 4
		1 的原码:00000000 00000000 00000000 00000001
		   补码: 00000000 00000000 00000000 00000001//正数三码一样
		1 >> 2:  00000000 00000000 00000000 00000100//整体左移两位,低位补零
													//结果是补码,要转为原码
	      											//最高位是0,为正数,三码一样	
		==> 4  //本质:1 << 2 ==>1*2*2=4

逻辑右移>>>

低位溢出,高位补零。

		//4 >>> 2 =1
		4的原码: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.coloradmin.cn/o/1266600.html

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

相关文章

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

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

内衣洗衣机和手洗哪个干净?小型洗衣机质量排名

这两年内衣洗衣机可以称得上较火的小电器&#xff0c;小小的身躯却有大大的能力&#xff0c;一键可以同时启动洗、漂、脱三种全自动为一体化功能&#xff0c;在多功能和性能的提升上&#xff0c;还可以解放我们双手的同时将衣物给清洗干净&#xff0c;让越来越多小伙伴选择一款…

基于Webserver的工业数据采集控制小项目

主要用到的知识点&#xff0c;http协议&#xff0c;modbus协议&#xff0c;以及进程间通信&#xff0c;消息队列&#xff0c;共享内存等 框架 数据采集 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #…

C#常用运算符的优先级

前言 运算符在C#编程语言中扮演着重要的角色&#xff0c;用于执行各种计算和操作。了解运算符的优先级是编写高效和正确代码的关键。本文将深入探讨C#中38个常用运算符的优先级划分和理解&#xff0c;并提供详细的说明和示例&#xff0c;以帮助读者更好地理解运算符的使用。 目…

linux设置主机名

查看主机名&#xff1a;hostname 临时修改主机名&#xff1a;hostname 新主机名 [rootlocalhost ~]#hostname centos [rootlocalhost ~]#hostname centos 永久修改主机名&#xff1a; [rootlocalhost ~]#cat /etc/hostname localhost.localdomain

C++ day42背包理论基础01 + 滚动数组

背包问题的重中之重是01背包 01背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 每一件物品其实只有两个状态&#xff0c;取或者不…

AI技术如何助力实现智慧交通

人工智能的常见优势在于能够实时、高效地分析处理大量的数据&#xff0c;并结合算法模型提供个性化、专业化的服务。在智慧交通方面&#xff0c;人工智能同样可以发挥专长&#xff0c;助力打造智能高效的交通运输网络&#xff0c;本篇就为大家简单介绍一下AI技术如何促进智慧交…

多平台小程序编译适配,是否会让更多App互联互通?

随着科技的飞速发展&#xff0c;我们正迅速进入一个以数字化为主导的时代。 在这个时代中&#xff0c;通信、小程序、快应用、云服务器等平台连接类软件如火如荼的发展&#xff0c;手机、手表、AR/VR眼镜等智能移动穿戴设备迅速的升级迭代&#xff0c;5G、芯片、算力等基础设施…

Python财经股票数据保存表格文件 <雪球网>

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.10 解释器 Pycharm 编辑器 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了&…

天软高频时序数据仓库

1天软高频时序数仓方案架构 天软高频时序数据仓库是深圳天软科技开发有限公司专为金融用户提供的专业高频行情数据处理方案&#xff0c;集数据接入、检查、处理、存储、查询、订阅、计算于一体。 方案支持各类系统的实时行情、非实时行情接入&#xff1b;还支持压缩存储、分布式…

Kubernetes Dashboard 涉及的一些常规技巧

Kubernetes Dashboard 提供了一个GUI形式的K8S集群管理工具&#xff0c;通过它我们能很容易的观察到集群资源消耗情况、服务器运行状态以及针对Pod的相关观察与操作&#xff1b; Dashboard 的相关配置 Dashboard 提供了通过配置启动命令行参数来控制其相关行为的能力&#xf…

知识工作者,需要填报工时么? | IDCF

作者&#xff1a;冬哥 来源&#xff1a;DevOps 引 子 “知识工作者&#xff0c;需要填报工时么&#xff1f;”忘记是因为什么&#xff0c;突然想到这个话题。似乎是没什么值得讨论的话题&#xff0c;我们的观点也是旗帜鲜明地认为没有必要&#xff0c;但实际现实中填报工时似…

游戏开发原画的设计方法

游戏原画设计是游戏开发中至关重要的一环&#xff0c;因为它直接影响到游戏的视觉吸引力和用户体验。以下是一些常见的游戏原画设计方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 理解游戏概念&…

如何用CHAT写“科技探索者”视频号运营方案

问CHAT&#xff1a;生成一篇“科技探索者”视频号运营方案&#xff0c;要求内容&#xff1a; &#xff08;1&#xff09;视频号的定位、面向的人群、主要发布哪方面的内容 &#xff08;2&#xff09;视频号的内容设计&#xff08;用什么样的方式来体现、最好有内容创意&#xf…

会议预告 | 求臻医学受邀参加2023·Inno China 产业创新大会

INNO CHINA 中国产业创新大会聚焦于数据驱动产业变革升级、医疗科技与产业转型升级、企业数字化转型升级、产业服务生态构建及商业智能融合发展等领域。如今&#xff0c;已成为中国新兴科技、热门赛道行业论坛、创新成果展示、参与、共创的高维度学术与产业年度相聚的节日&…

CRM系统是怎样帮助销售流程自动化的?

销售业绩是衡量企业经营的重要指标&#xff0c;也是销售人员一直要达成的目标。销售业绩能否提高取决于销售人员的能力、客户服务水平&#xff0c;还需要借助有效的工具。CRM系统就是这样的一款软件。企业如何提高销售业绩&#xff1f;不妨试试CRM销售流程自动化。 CRM如何实现…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于世界模型深度强化学习的含风电电力系统低碳经济调度》

这个标题表明研究的主题涉及到一个电力系统&#xff0c;该系统包含风电&#xff0c;并且使用基于世界模型的深度强化学习进行低碳经济调度。以下是对标题中各个关键词的解读&#xff1a; 基于世界模型&#xff1a; 这可能指的是使用一种模型来表示电力系统所在的环境&#xff0…

使用mock.js模拟数据

一、安装mock.js npm i mockjs 二、配置JSON文件 我们创建一个mock文件夹&#xff0c;用于存放mock相关的模拟数据和代码实现。 我们将数据全部放在xxx.json文件夹下&#xff0c;里面配置我们需要的JSON格式的数据。 注意&#xff1a;json文件中不要留有空格&#xff0c;否则…

如何使用 ONLYOFFICE 文档代理功能

简介 ONLYOFFICE 文档以在线应用程序的方式运行&#xff0c;在很多情形中可能会存在需要将其集成至内部网络的情形。如今&#xff0c;许多内部网络维护者可能会出于某些目的使用不同的 Web 服务器作为代理。此时ONLYOFFICE 文档中的代理功能就能派上用场了。市面上应用最广泛的…

交流负载的功能实现原理

交流负载的功能实现原理主要涉及到电力电子技术、电机控制技术和电力系统保护技术等多个方面。 交流负载的功能实现需要通过电力电子器件进行电能的转换和控制&#xff0c;电力电子器件主要包括开关器件和电力电子变压器等。开关器件主要用于实现电能的通断控制&#xff0c;如晶…