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 = 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
		算术左移的本质总结是对的,大家可以用我上面的方法推导一下 

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字人透明屏幕的技术原理是什么?

数字人透明屏幕的技术原理主要包括人脸识别和全息影像技术。其中&#xff0c;人脸识别技术是通过摄像头捕捉游客的面部表情和动作&#xff0c;并将其转化为数据指令&#xff0c;以便与数字人物进行互动。而全息影像技术则是利用透明屏幕&#xff0c;通过全息投影的方式将数字人…

rider编辑器抛出异常 忽略try catch

如题 代码加了try catch 后用户使用体验是好了 但开发过程中 报错了不方便排查 启用这些配置后 trycatch里的异常也会抛出 补充一下默认配置,方便还原

【LeetCode:1670. 设计前中后队列 | 数据结构设计】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

21.Oracle的程序包(Package)

Oracle的程序包Package 一、Package的概述1、什么是Oracle11g的Package2、Package的作用是什么3、常见的系统内置Package 二、创建Package的相关语法1、Package的创建语法2、Package的删除3、具体案例4、Package的使用5、与Package相关的其他语法 三、常见内置程序包的使用1、…

MYSQL存储

注意&#xff1a; 1.如果没有指定的SESSION/GLOBAL&#xff0c;默认是SESSION&#xff0c;会话变量。 2.mysql服务重新启动之后&#xff0c;所设置的全局参数会失效&#xff0c;要想不失效&#xff0c;可以在/etc/my.cnf中配置。 变量 用户定义变量是用户根据需要自己定义变量…

二十章 多线程

线程简介 在 Java 中&#xff0c;并发机制非常重要。在以往的程序设计中&#xff0c;我们都是一个任务完成后再进行下一个任务&#xff0c;这样下一个任务的开始必须等待前一个任务的结束。Java 语言提供了并发机制&#xff0c;程序员可以在程序中执行多个线程&#xff0c;每一…

项目中的svg图标的封装与使用

1.安装 npm install vite-plugin-svg-icons -D2.在vite.config.ts中配置 **所有的svg图标都必须放在assets/icons // 引入svg import { createSvgIconsPlugin } from vite-plugin-svg-iconsexport default defineConfig({plugins: [vue(),createSvgIconsPlugin({iconDirs: [p…

PWM 正玄波形 通过C语言生成

#include <stdio.h> #include <math.h> #include <stdint.h>#define SAMPLE_POINT_NUM (200) /* 需要生成的点的个数 */ #define SINE_MAX (255) /* sin 函数幅值 */ #define PI (3.14…

共享充电宝被取代,共享WIFI项目将成市场趋势!

在创业领域如果有这样一个项目&#xff0c;你会选择哪一个&#xff1f;前者投资十万风险大&#xff0c;后者投资几千风险小。同样需要扫街地推&#xff0c;但产生的利润是相同的。相信100%的人会选择后者。实际上这两个项目前者就是共享电宝&#xff0c;后者就是共享WiFi项目。…

ground truth 在深度学习任务中代表的是什么意思?

1、概念 在深度学习领域&#xff0c;ground truth (中文意思是“地面真实值”或“基准真实值”&#xff0c;简单理解就是真实值) 是指用于训练和评估模型的准确标签或数据。它是机器学习算法的参考标准&#xff0c;用于衡量模型的性的和判断模型的准确性&#xff0c;本文将介绍…

【傻瓜级JS-DLL-WINCC-PLC交互】4.DLL读取WINCC内部变量

思路 JS-DLL-WINCC-PLC之间进行交互&#xff0c;思路&#xff0c;先用Visual Studio创建一个C#的DLL控件&#xff0c;然后这个控件里面嵌入浏览器组件&#xff0c;实现JS与DLL通信&#xff0c;然后DLL放入到WINCC里面的图形编辑器中&#xff0c;实现DLL与WINCC的通信。然后PLC与…

一名技术Leader应该是创作者

今天看了一本书叫做《黑客与画家》。它里面提到一个很重要的概念就是黑客&#xff08;优秀的程序员&#xff09;是一名建筑师&#xff0c;而不是一名工程师。 传统的主管和互联网的Leader 这两者有什么区别呢&#xff1f;关键点在于建筑师是思考做什么&#xff0c;而工程师是…

数据结构(超详细讲解!!)第二十五节 树与森林

1.树的存储结构 和线性表一样&#xff0c;树可以用顺序和链式两种存储结构。 树的顺序存储结构适合树中结点比较“满”的情况。根据树的非线性结构特点&#xff0c;常用链式存储方式来表示树。树常用的存储方法有&#xff1a;双亲表示法、孩子表示法和孩子兄弟表…

【LeetCode刷题-链表】--86.分隔链表

86.分隔链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ class…

SpringSecurity+JWT实现权限控制以及安全认证

一.简介 Spring Security 是 Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 认证&#xff1a;验证当前访问系统的是不是本系统的用户&#xff0c;并且要确认具体是哪个用户​ 授权&…

虚幻学习笔记3—UI跟随弹窗

一、前言 本文使用的虚幻引擎5.3.2&#xff0c;继点击场景3D物体的两种处理方式的基础完成对3D物体的点击触发后&#xff0c;我们需要制作一个可以弹窗显示该物体信息的UI面板&#xff0c;同时保证弹窗可以跟随物体。另外还讲了一种UI上的悬浮提示跟随弹窗。 二、实现 2.1、创…

Pytorch:torch.utils.data.DataLoader()

如果读者正在从事深度学习的项目&#xff0c;通常大部分时间都花在了处理数据上&#xff0c;而不是神经网络上。因为数据就像是网络的燃料&#xff1a;它越合适&#xff0c;结果就越快、越准确&#xff01;神经网络表现不佳的主要原因之一可能是由于数据不佳或理解不足。因此&a…

ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局

近年来&#xff0c;由于社会经济的快速发展和人口增长&#xff0c;社会活动对环境的压力不断增大&#xff0c;人地矛盾加剧。虽然全球各国在生态环境的建设和保护上已取得不少成果&#xff0c;但还是未从根本上转变生态环境的恶化趋势&#xff1b;生态破坏、环境退化、生物多样…

rss服务搭建记录

layout: post title: RSS subtitle: vps搭建RSS服务 date: 2023-11-27 author: Sprint#51264 header-img: img/post-bg-universe.jpg catalog: true tags: - 折腾 文章目录 引言RSShub-dockerRSS-radarFreshrssFluent reader获取fever api配置Fluent Reader同步 结语 引言 一个…

【代码】数据驱动的多离散场景电热综合能源系统分布鲁棒优化算法matlab/yalmip+cplex/gurobi

程序名称&#xff1a;数据驱动的多离散场景电热综合能源系统分布鲁棒优化算法 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 代码简介&#xff1a;数据驱动的分布鲁棒优化算法。考虑四个离散场景&#xff0c;模型采用列与约束生成(CCG)算法进行迭代求解&#xff0c;场景分…