关于java位运算符&,~,^,|,<<,>>的整理(包含二进制与十进制的转换)

2023-05-16

要讲java一些奇奇怪怪的运算符号之前,必须先了解二进制,因为这些看不懂的运算符都是基于二进制运算的

计算机里二进制的运算,往往比十进制运算来的快。
首先了解下转换规则(相互转换):

转码之前,有一些名词概念:

1、原码
一个正数,按照绝对值大小转换成二进制数,称为原码
2、反码
将二进制数按位取反,所得的新二进制数称为原二进制数的反码
其实就是把原码中的0变为1,1变为0
例如:0000 0101 和1111 1010就是互为反码
3、补码
在反码的基础上加1称为补码,一般在算负数的时候会用到

十进制转二进制:

1、正整数转换二进制


2、负整数转换二进制


3、小数转换二进制


重点掌握前面两个:
1、正整数转换二进制
除二取余,然后倒序排列,高位补零。

如下图:三步操作(字丑勿喷)

2、负整数转换二进制
  先将对应的正整数转换成二进制
  对二进制取反,这边有个不一样的地方,原来那个正数的补位都是0,但是你取反了,那就证明负数补位的时候,要补1
  然后对结果再加1(这里的1,是十进制的1,但是十进制的1对应的二进制就是00000001)

  如下图:

3、小数转化二进制
  先对小数部分*2,乘到小数部分为0
  然后再对整数部分计算

  最后合起来
  如下图:
  

二进制转十进制:

这里会有两种情况,有符号数,和无符号数
1、无符号数的话就是直接转换成正整数

如下图:

2、有符号数的话,就把第一个数字看成符号,1就是负数,0就是正数
  1)如果是正数,那就是第一位不用做计算,把后面的7位拿起来计算,
  比如0111 1111 结果就是127
  2)如果是负数,那算法就是先对结果(这个结果是补码)减1获得反码,然后取反(获得原码),然后计算,跟负十进制的数转换成二进制的数的操作是相反的
  比如1111 1111,结果就是-1
  转换过程:1111 1111 -1 = 1111 1110
取反:1111 1110 =》 0000 0001

转换:1*2的0次方=1,那因为我们一开始就定义它为负数,所以就是-1


======================================华丽的分割线============================================

明白了上面的相互转换之后
就开始来理解java中一些奇特的符号:

1、&(按位与)


2、|(按位或)


3、^(按位异或)


4、~ (按位取反)


5、>> (右移运算符)


6、<< (左移运算符)


这些就是java中对二进制数字的计算,别的语言应该还有些其他的符号

本人水平有限所以。。。。


1、& 与
规则:先将两个数字转换为二进制,然后每一位进行匹配
     只有当两个位置上都是1的时候,才会返回1
例子:9&12
9:1001
12:1100
所以结果应该是:1000=》转换为十进制:8
这个符号也有个例子,在Hadoop的MapReduce中默认实现的HashPartitioner类中的分区方法
public int getPartition(K2 key, V2 value, int numReduceTasks) {  
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;  

就是使用这个符号。


2、| 或
规则:先将两个数字转换为二进制,然后每一位进行匹配
 两个位只要有一个为1,那么结果就是1,否则就为0。
例子:9|12
9:1001
12:1100

所以结果应该是:1101=》转换为十进制:13


3、^ 异或
规则:先将两个数字转换为二进制,然后每一位进行匹配
两个操作数的位,相同则结果为0,不同则结果为1。
0 ^ 1 =1,1 ^ 1 = 0,0 ^ 0 = 0,1 ^ 0 = 1
例子:9^12
9:1001
12:1100

所以结果应该是:0101=》转换为十进制:5


4、~ 取反
规则:这个是对一个数字的操作
 先将这个数字转换为二进制
 然后每个位上的数字,0变成1,1变成0
例子:~9
9:1001
~9:0110
所以结果应该是0110=》转换为十进制:6
呵呵,你自己试试,答案是错的。。不是6,答案是-10
为什么?
先说一个概念int类型是4字节,1字节是8位,所以int类型有32位
然后,9的值是1001,其实你全部写出来应该是0000 0000 000...(前面有28个0)然后1001
所以对9取反,不能简单的写成0110,因为0110代表的是0000 0000 000...(前面有28个0)然后0110
~9:1111 1111 1111 1111 1111 1111 1111 0110
接着你可以在代码中试试:
String i = Integer.toBinaryString(-10);
System.out.println(i);
System.out.println(i.length());
打印出来的就是:
11111111111111111111111111110110
32
结论:所以这里就要说到,在上文中提到的二进制的有符号数和无符号数
再重新阐述一次:简单来说,例如byte长度是8位,无符号数的情况下,1111 1111 =》255

有符号数的情况下,因为最高位1代表负号,0代表正号,所以 0111 1111 =》127,所以1000 0000 =》-128

所以你还记得byte类型能表示的长度是-128---127吗,就是这个原因
那么在java中几乎所有的正数取反,会得到负数,负数取反会得到正数!
比如1000 0001 这个二进制的有符号数,他代表的值就是-127
所以这是取反操作的一个坑,也是不少网络给出的什么二进制转换器输入1000 0000得到的值为128的原因(因为他识别成无符号二进制数字)
如果你还不太懂,而且又想继续了解的话:http://www.cnblogs.com/ASPNET2008/archive/2009/04/29/1446471.html

这篇别人的文章,应该可以帮到你,作者我也不知道是谁(因为他也是转载的),如对原作者有所冒犯,实在抱歉,请给我留言,我标注作者!!


5、>> (右移运算符)和<< (左移运算符)
这两个东西,放在一起记录,是因为这两个操作是一样的,就是一个位移操作
1、举例1、12>>2
操作:
先将12转换为二进制 ==》1100
然后把整体向右移动两位 ==》0011
最后转换为十进制 ==》 1*2的0次方+1*2的1次方=3
所以答案:3
2、举例2、12<<2
操作:
先将12转换为二进制 ==》1100
然后把整体向左移动两位 ==》110000
最后转换为十进制 ==》 1*2的4次方+1*2的5次方=48
所以答案:3
结论:所以也能简单的理解为>>3就是原来的数字除以2的3次方,<<3就是乘以2的3次方

好的,本人菜鸟一只,整理就到这里,如果还有什么疑问,可以给我留言,如果有说的不对的地方,请各路大神指出!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于java位运算符&,~,^,|,<<,>>的整理(包含二进制与十进制的转换) 的相关文章

  • 新硬盘装win10 uefi(又非uefi)弃坑小记

    无风扇小主机不能内置硬盘 xff0c 是内置的那种msata卡 xff0c 那种卡太贵了 xff0c 还是用硬盘盒装了硬盘接usb3 0 用diskgenius xff0c 将分区表转换成gpt xff0c 第一个分区会提示建esp分区 x
  • java两个List的交集,并集

    使用apache的CollectionUtils工具类 推荐 public static void main String args String arrayA 61 new String 34 1 34 34 2 34 34 3 34 3
  • 浅谈SPN

    SPN 切片分组网络 xff0c 它是PTN的演进 xff0c 更多的是为5G传输网量身打造 5G中所谓的网络切片 是核心网网元的灵活组合 xff0c 构成适用于各种业务场景的切片网络 xff0c 例如无人驾驶对于高可靠低时延网络的需求 x
  • 【C语言】排序详解——冒泡排序

    前言 xff1a 冒泡排序可以说是排序系列中最简单也最基础的一种排序的方式 xff0c 尽管它十分的简单易懂 xff0c 但依旧会有一些小问题是大家可能忽略的 xff0c 因此我打算将不同排序分成单独的文章进行讲解 xff0c 这样既不会显
  • Android设备的各种唯一标识符 ID

    IMEI 只有Android手机才有 xff0c IMEI号是一串15位的号码 xff0c 比如像这样 359881030314356 span class token class name TelephonyManager span sp
  • R语言-管道函数

    符号 xff1a gt 这是管道操作 xff0c 其意思是将 gt 左边的对象传递给右边的函数 说明 xff1a xff05 gt xff05 来自dplyr包的管道函数 xff0c 其作用是将前一步的结果直接传参给下一步的函数 xff0c
  • NFS启动出错Restarting nfs-kernel-server (via systemctl): failed!

    之前NFS已经安装完毕 xff0c 并且能够正常运行 xff0c 今天运行时出现一下错误 sudo etc init d nfs kernel server restart Restarting nfs kernel server via
  • Uncaught TypeError: upload is not a function at HTMLInputElement.onchange

    js 中标签的id名称不能和方法名一样 xff0c lt input type 61 34 file 34 id 61 34 upload 34 onchange 61 34 upload 34 gt 改为 lt input type 61
  • 【COMSOLX光纤仿真学习笔记】

    COMSOLX光纤仿真学习笔记 一根光纤的建模仿真过程绘制几何结构添加材料添加物理场网格模式分析参数化扫描绘制图表一些常用命令和公式 一根光纤的建模仿真过程 首先要定义光纤的参数 xff0c 结构参数 xff0c 材料参数等等 xff0c
  • python-pip镜像源永久指定安装源

    每次临时指定源地址比较麻烦 xff0c 可以通过以下方式配置永久源 在主目录创建 pip文件夹 mkdir span class token operator span span class token operator span span
  • windows系统下搭建cloudreve网盘系统

    最近博主想搭建属于自己的网盘系统 xff0c 去github上看了一些开源项目 xff0c 比较对cloudreve感兴趣 xff0c 但是github的搭建步骤不全以及网上没有完整的搭建博文 xff0c 于是 xff0c 博主想自己搭建c
  • OpenStack----多节点部署安装,实操演示!!

    xff08 本地源 xff09 OpenStack多节点部署安装 xff0c 实操演示 xff01 xff01 文章目录 前言一 xff1a 实验环境1 1 xff1a 环境介绍1 2 xff1a 实验拓扑图1 3 xff1a 实验目的 二
  • mysql同一个事务中先插入再查询与先删除再查询结果分析

    一 xff0c 现象展示 1 先插入再查询 BEGIN INSERT INTO video CREATE TIME UPDATE TIME VERSION VID VIDEO NAME SPEED RATE HORIZONTAL VERTI
  • WebAssembly 与 Rust 编程系列06 Rust模块与JavaScript交互

    WebAssembly 与 Rust 编程系列06 Rust模块与JavaScript交互 About 简介 上一篇文章 WebAssembly 与 Rust 编程系列05 Rust编写wasm模块 我们介绍了最简单的 Rust 导出was
  • POI 实现合并单元格以及列自适应宽度

    POI是apache提供的一个读写Excel文档的开源组件 xff0c 在操作excel时常要合并单元格 xff0c 合并单元格的方法是 xff1a sheet addMergedRegion new CellRangeAddress 1
  • 信息学奥赛一本通 1049:晶晶赴约会 | OpenJudge NOI 1.4 11

    题目链接 ybt 1049 xff1a 晶晶赴约会 OpenJudge NOI 1 4 11 晶晶赴约会 题目考点 1 逻辑运算符 xff1a 或 2 if else语句 3 三目运算符 解题思路 如果看展览那天的星期是周一 周三或周五 x
  • OpenStack Ussuri在Ubuntu20.04LTS、Ubuntu18.04LTS上GA

    紧跟OpenStack新版本Ussuri的发布 xff0c Canonical宣布了OpenStack Ussuri在Ubuntu20 04LTS和Ubuntu18 04LTS上GA 新的OpenStack上游版本最显著的增强是围绕Open
  • kali各种攻击手法笔记

    kali Linux笔记 xff1a 1 攻击mac flood 命令 xff1a macof 2 攻击DOS xff08 dhcp food xff09 命令 xff1a yersinia G 3 DOS攻击 TCP SYN flood
  • LFTP连接FTPS

    参考 xff1a https www cnblogs com wangtaobiu p 14240171 html https linux cn article 5460 1 html http www voidcn com article
  • centos7.9 更改yum 源 (联网与无网)

    一 改本地源为阿里源 xff08 联网 xff09 参考 xff1a https blog csdn net ctypyb2002 article details 80635924 1 设置 aliyun 的 yum 源 先备份 span

随机推荐