【Java基础】符号位、原码、补码、反码、位逻辑运算符、位移运算符、复合位赋值运算符

news2024/10/4 17:11:56

文章目录

  • 前言:符号位、原码、补码、反码
    • 1.是什么
    • 2.各种码转换
  • 一.二进制高低位
    • 1.1.什么是高低位
    • 1.2.高低位交换
  • 二.位逻辑运算符
    • 位与运算 &
    • 位或运算 |
    • 异或运算 ^
    • 取反运算 ~
  • 三.位移运算符
    • 左位移运算符 <<
    • 右位移运算符 >>
      • 1.正数右移:
      • 2.负数右移(带符号右移)
      • 3.无符号右移>>>
  • 四.复合位赋值运算符
  • 五.总结

前言:符号位、原码、补码、反码

1.是什么

首先 我们看到的数,都是以二进制的形式在计算机下操作的。并且位运算符的操作对象是补码

符号位 :如8位数,左边第一位是符号位,剩余7位表示数据大小(1为负,0为正
正数: 原码=反码=补码
负数: 原码 ----> 反码 (取反) ---->补码 (+1)

  • 原码:将一个整数,转换成二进制,就是其原码。
  • 反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。
  • 补码:正数的补码就是其原码;负数的反码+1就是补码

2.各种码转换

1.负数原码转反码

  • 符号位不变,数值位按位取反。
    原码:1(符号位不变)000 1100
    反码:1(符号位不变)111 0011
    

2.负数原码转补码的

  • 先转换为反码(符号位不变,数值位按位取反)

  • 在反码的基础上末位加一

    原码:1(符号位不变)010 0101
    反码:1101 1010
    补码:1101 1011
    

3.负数原码转补码的

  • 符号位不变,数值位按位取反,末位加一
    补码:     1110 1011
    补码取反: 1001 0100
    原码:    1001 0101
    

4.负数反码相互补码

  • 负数的反码转换为补码:末位加一
    java 反码:1100 1110 补码:1100 1111
    负数的补码转换为反码(源码的反码):末位减一
    补码:1100 1110
    反码:1100 1101 (借位减)
    

5.正数取反

  • 先将正数原码按位取反,得到一个负数,由于负数以补码形式存在,再转换为负数的反码,最后末位加一得到补码。
0000 1100 #原码
1111 0011 #正数取反得到负数的原码
1000 1100 #负数的原码取反后得到反码
1000 1101 #反码加一得到补码

一.二进制高低位

1.1.什么是高低位

二进制是一种数字编码方式,由0和1两个数字组成。在二进制中,每一位都有一定的权值,从右往左依次为1、2、4、8、16、32、64、128...依次递增(都是2的整数倍)。

  • 最右边的第1位称为二进制的低位, 第2位称为次低位, 以此类推,第n位称为第n-1 位
  • 最左边的第1位称为二进制的高位

举个例子,二进制数 10110的低位是 0,次低位是1,第3位是1,第4位是0,第5位是1,因此它的高位是1

  • 如果用内存中的2个字节表示一个16位的数,那么其中的一个字节将存放最低的8位有效位,而另一个字节将存放最高的8位有效位。如图所示。
  • 通俗一点讲,就是从左向右,越左位权越高
    在这里插入图片描述

1.2.高低位交换

   x= 10000110 11011000

称这个二进制数的前8位为“高位”,后8位为“低位”。现在写一程序将它的高低位交换。

  1. x执行右移 8 位,右移时会执行逻辑右移即高位补0,因此x右移8位将得到 00000000 10000110
  2. x左移8位将得到11011000 00000000
  3. 两者 在 | 就的实现了交换
00000000 10000110
11011000 00000000
//当相同位上的数字至少有一个为1时,结果为1 最终结果实现高低位呼唤
11011000 10000110
a = (a >> 8) | (a << 8);

二.位逻辑运算符

位逻辑运算符包含 4 个:&(与)、|(或)、~(非)和 ^(异或)。除了 ~(即位取反)单目运算符外,其余都为双目运算符

位与运算 &

  • 按二进制形式,低位对齐,高位不足的补零。当相同位上的两个数字都为1时,结果为1;否则为0

在这里插入图片描述

在这里插入图片描述``

位或运算 |

  • 按二进制形式,低位对齐,高位不足的补零。当相同位上的数字至少有一个为1时,结果为1;否则为0
    在这里插入图片描述

异或运算 ^

  • 按二进制形式,低位对齐,高位不足的补零,当相同位上的两个数字不同时,结果为1;相同时为0
    在这里插入图片描述

取反运算 ~

  • 当相同位上的为1时结果为0,反之。相同位上的为0时结果为1
    在这里插入图片描述

三.位移运算符

左位移运算符 <<

按二进制形式把所有的数字向左移动对应的位数,高位舍弃,低位的空位补零。即:将二进制数字向左移动,移动几位就在最右侧补多少个0。

11 << 1 =22
在这里插入图片描述

  • 原来数的所有二进制位都向左移动 1 位。原来位于左边的最高位 0 被舍弃再向尾部追加 0 补位。最终到的结果是 22,相当于原来数的 2 倍
    • 左移n位相当于乘以2的n次方
      • 11 << 1 等于 11x2的1次方 等于 22、11 << 2 等于 11x2的2次方 等于 44

右位移运算符 >>

1.正数右移:

按二进制形式把所有的数字向右移动对应的位数,低位舍弃,高位的空位补零。即:将二进制数字向右移动,移动几位就在最左侧补多少个0。

11 >> 1 = 5
在这里插入图片描述

  • 原来数的所有二进制位都向右移动 1 位。原来位于右边的最低位 1 被移出舍弃,再向最高位追加 0 补位。最终到的结果是 5,相当于原数整除 2 的结果。
    • 正数右移n位相当于原数除2的n次方
      • 11 >> 1 等于 11/1的2次方取整等于6、11 >> 2 等于 11/2的2次方4取整等于2

2.负数右移(带符号右移)

高位补1,等价于对绝对值除以2的n次方,再加上负号

-100 >>4 : -100带符号右移4位 =等于100/16

-100原码:   
   10000000    00000000    00000000   01100100
1. -100补码: 保证符号位不变,其余位置取反加1
   11111111    11111111    11111111   10011100
2. 右移4: 在高位补111111111    11111111    11111111   1001高位补41)
   
补码形式的移位完成后,结果不是移位后的结果,要根据补码写出原码才是我们所求的结果。其方法如下:

3.保留符号位,然后按位取反
11111111    11111111    11111111   11111001
//按位取反
10000000    00000000    00000000   00000110

4.然后加1,即为所求数的原码:
10000000    00000000    00000000   00000110
//+1
10000000    00000000    00000000   00000111

结果为:-7

3.无符号右移>>>

不考虑符号位,统一补0,用于移动无符号数,不会改变符号位的值,等价于对无符号数除以2的n次方。

-100 >>>4

 -100原码:   10000000    00000000    00000000   01100100

1. -100补码:保证符号位不变,其余位置按位取反加1
10000000  00000000  00000000   01100100
11111111  11111111  11111111   10011100

2.无符号右移4位 :: 在高位补0
11111111  11111111    11111111    10011100
00001111  11111111    11111111    11111001

即为所求:268435449

四.复合位赋值运算符

  • &= 按位与赋值 num1 &= num2 等价于 num 1=num 1 & num2
  • |= 按位或赋值 num1 |= num2 等价于 num 1=num 1 | num2
  • ^= 按位异或赋值 num1 ^= num2 等价于 num 1=num 1 ^ num2
  • -= 按位取反赋值 num1 -= num2 等价于 num 1=num 1 - num2
  • «= 按位左移赋值 num1 «= num2 等价于 num 1=num 1 « num2
  • »= 按位右移赋值 num1 »= num2 等价于 num 1=num 1 » num2

五.总结

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

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

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

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

相关文章

什么是QPS,什么是RT

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;什么是QPS&#xff0c;什么是RT ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加…

生产慢查询问题分析

1.问题描述 7月1日零点set_24出现大量慢查询告警&#xff0c;经DBA定位为子系统涉及的一条查询语句出现慢查询&#xff0c;引起set_24的cpu使用率突增&#xff0c;触发大量告警&#xff0c;查看生产执行计划发现慢查询为索引跳变引起&#xff1b;具体出现问题的sql语句如下&am…

【裸机开发】I2C 通信接口(三)—— I2C 底层驱动接口实现

目录 一、I2C 初始化 二、产生开始 / 停止信号 1、开始信号 2、重复开始信号 3、停止信号 三、向总线上发送数据&#xff08;阻塞模式&#xff09; 四、从总线上读取数据&#xff08;阻塞模式&#xff09; 五、整合&#xff1a;数据读写统一调用接口 一、I2C 初始化 初…

springboot驾校管理系统

框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 …

springboot+dynamic-datasource实现多数据源动态切换,非@DS注解方式

springbootdynamic-datasource实现多数据源动态切换&#xff0c;非注解 一、前言二、方案思路三、代码实现 一、前言 最近在分析SaaS平台多租户的功能&#xff0c;必然涉及数据库部分的功能&#xff0c;多租户的设计方案要考虑租户隔离数据和租户共享数据&#xff0c;共享数据…

concrt140.dll怎么修复?哪种修复方法更值得推荐

运行软件的时候&#xff0c;计算提示找不到concrt140.dll&#xff0c;第一次遇到的小伙伴肯定不知道是什么意思。concrt140.dll是Microsoft Visual C Redistributable for Visual Studio 2015的一部分。它是一个动态链接库文件&#xff0c;包含在Windows操作系统中。这个文件主…

【Python】瓶装液位检测系统

文章目录 概要效果图整体架构流程技术细节 概要 本代码是一个简单的GUI应用程序&#xff0c;用于瓶装液位检测系统。 效果图 整体架构流程 整体架构流程如下&#xff1a; 创建GUI窗口和必要的部件&#xff1a; 创建一个主窗口&#xff08;root&#xff09;作为GUI应用程序的…

分享一套开源充电桩云平台(v2.5.1)-- 支持二轮(电动自行车)、四轮(电动汽车)

开源充电桩云平台&#xff08;v2.5.1&#xff09; 支持二轮(电动自行车)、四轮(电动汽车) 后台体验地址 二轮后台体验地址&#xff0c;star star &#xff1a; 点我访问 四轮后台体验地址&#xff0c;star star &#xff1a; 点我访问 用户端二维码 公众号二维码 小程序二维…

攻防世界-WEB2

代码审计 首先进行代码审计 <?php $miwen"a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";function encode($str){$_ostrrev($str);// echo $_o;for($_00;$_0<strlen($_o);$_0){$_csubstr($_o,$_0,1);$__ord($_c)1;$_cchr($__);$_$_.$_c; …

2023- itwangyang - mac mysql 终端启动命令

在mac上使用mysql终端进行操作时&#xff0c;需要先启动mysql服务。以下是启动mysql服务的命令&#xff1a; sudo /usr/local/mysql/support-files/mysql.server start执行该命令后&#xff0c;会出现一些提示信息&#xff0c;等待一段时间后mysql服务就启动成功了。 接下来&…

【Java】面向对象基础 之 继承

一、继承 在前面的章节中&#xff0c;我们已经定义了Person类&#xff1a; class Person {private String name;private int age;public String getName() {...}public void setName(String name) {...}public int getAge() {...}public void setAge(int age) {...} }现在&am…

git报错:remote: Access denied (URL 403)

git报错&#xff1a;remote: Access denied fatal: unable to access ‘ https:/ /gitee. cohe requested URL 403 大概的原因&#xff0c;是之前更改了 可能因为我之前在git bash中配过ssh&#xff0c;系统已经将指向git的用户设置了别的位置&#xff0c;所以…

DAY44:动态规划(四)整数拆分(递归+DP递推都可以做,注意区别和理解)

文章目录 343.整数拆分思路1&#xff1a;递归法&#xff08;最直观的想法&#xff09;递归思路普通递归写法注意点&#xff1a;max的嵌套普通递归存在的问题 记忆化搜索递归写法时间复杂度 递归解法总结 思路2&#xff1a;动态规划&#xff08;注意递推的理解&#xff09;确认D…

Transformer 模型详解

Transformer模型 https://blog.csdn.net/m0_67084346/article/details/128138486 https://blog.csdn.net/benzhujie1245com/article/details/117173090 2017 年&#xff0c;Google 在论文 Attention is All you need 中提出了 Transformer 模型&#xff0c;其使用 Self-Atten…

一个SpringMVC的小项目

一个图书管理小项目&#xff1a; 定义对应的表结构&#xff0c;为了学习所以才添加大量的 SQL 规则&#xff0c;要记得针对货币的处理方案 create table if not exists tbl_books( id bigint primary key auto_increment,book_name varchar(32) not null,book_price numeric(8…

专业的PDF文件压缩工具推荐,让你的PDF文件轻松压缩

​在参加专业的比赛时&#xff0c;就需要用到pdf文件&#xff0c;如果pdf文件过大操作和分享起来就特别不方便&#xff0c;其实可以使用专业的pdf文件压缩工具来处理。今天就分享一款pdf在线压缩工具&#xff0c;通过浏览器就可以快速完成pdf压缩&#xff08;https://www.yasuo…

SQL22 统计每个学校的答过题的用户的平均答题数

SELECT university,COUNT(qt.question_id)/COUNT(distinct(qt.device_id)) avg_answer_cnt FROM question_practice_detail qt LEFT JOIN user_profile ut ON qt.device_idut.device_id GROUP BY university

使用Word轻松实现PDF转Word

以前WPS还能通过每天打卡白嫖会员&#xff0c;最近不行了&#xff0c;害&#xff0c;羊毛没了 现在重新回归Word&#xff0c;利用Word就可以将PDF转化为Word 一、通过Word新建一个Word文档并打开 二、点击 文件 —> 打开 三、浏览&#xff0c;找到要转的PDF 四、点击确定&…

基础篇--初识STM32

初识STM32 STM32是什么 ST&#xff1a;意法半导体 M&#xff1a;MCU/MPU32:32位 ST累计推出了&#xff1a;5大类、18个系列、1000多个型号的Cortex内核微控制器 STM32芯片分类 ST中文社区网&#xff1a;https://www.stmcu.org.cn/ ST官网&#xff1a;https://www.st.com …

4.5Java EEMyBatis缓存机制

一、 一级缓存 MyBatis的一级缓存级别 MyBatis的一级缓存是SqlSession级别的缓存。如果同一个SqlSession对象多次执行完全相同的SQL语句时&#xff0c;在第一次执行完成后&#xff0c;MyBatis会将查询结果写入到一级缓存中&#xff0c;此后&#xff0c;如果程序没有执行插入、…