java中的常见运算符的计算方式

简介: 本文介绍了计算机中二进制数的原码、反码和补码的概念及其转换方式。原码是符号位加真值的绝对值;反码中正数不变,负数其余位取反;补码在反码基础上加1。文章还详细解释了Java中的常见运算符(如按位与、或、异或、移位等)如何基于二进制进行计算,并探讨了使用补码的原因,包括统一符号位处理和扩展表示范围。通过具体代码示例帮助理解这些概念。

原码,反码,补码

在说计算方式之前,先说一下计算机中的原码,反码和补码,计算机中存储的二进制都为数据的补码

原码

符号位加上真值的绝对值

代码解读

复制代码

+1: 0000 0001
-1: 1000 0001

反码

正数的反码就是其本身,负数的反码实在其原码的基础上,符号位不变,其余部位取反

代码解读

复制代码

+1: 0000 0001
-1: 1111 1110

补码

正数的补码是其本身,负数的补码是在原码的基础上,符号位不变,其余各位取反,最好+1(即在反码的基础上+1)

代码解读

复制代码

+1: 0000 0001
-1: 1111 1111

java中常见运算符的计算方式

计算机中的计算方式都是二进制计算,下面说的计算方式中,均要把十进制转换为二进制进行计算

& (按位与 &) 两个为真才为真,例如:1 & 1 = 1, 1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0

3 & 5 = 1

代码解读

复制代码

3:	0011
5:	0101
    0001 => 1

&& (逻辑与) 两个为真才为真,如果前面的表达式为假,后面的表达式不在参与计算

| (按位或 |)一个为真即为真,例如: 1 | 1 = 1, 1 | 0 = 1, 0 | 1 = 1, 0 | 0 = 0

6 | 2 = 6

代码解读

复制代码

6:  0110
2:  0010
    0110 => 6

|| (逻辑或) 一个为真即为真,后面的计算不在继续,如果前面的为假,在计算右边的表达式

^ (异或运算符) 不同的即为真,运算规则:1 ^ 0 = 1, 1 ^ 1 = 0, 0 ^ 1 = 1, 0 ^ 0 = 0

5 ^ 9 = 12

代码解读

复制代码

5:  0101
9:  1001
    1100 => 12

<<(左移运算符) 将对应数字的有效位二进制往左移多少位,右边补0,正数第一位符号位补0,负数第一位符号位补1。在没有溢出的情况下,等于2的n次方。高位移出之后舍弃,低位的空挡补零

5 << 2 = 20

代码解读

复制代码

5: 0000 0101 左移两位: 0001 0100 => 20

>> (右移运算符) 把有效位右移对应个数,在没有溢出的情况下相当于除以2的n次方。低位的移出舍弃,高位的空位补符号位,即正数补0,负数补1

5 >> 2 = 1

代码解读

复制代码

5:  0000 0101 右移两位: 0000 0001 => 1

>>> (无符号右移) 忽略符号扩展位,0 补最高位,只是针对负数进行运算,正数的话和右移没有区别

下面的计算例子采用8位表示

6 >>> 2 = 1

代码解读

复制代码

6:  0000 0110  >>>  0000 0001 => 1

-6 >>> 2 = 33

代码解读

复制代码

-6  1000 0110  >>>  0010 0001 => 33

~ (取反运算符)

~5 = -6

代码解读

复制代码

5:  0000 0101 ~ 1111 1010 = -6

思考关于计算机中原码,反码,补码的问题

为什么使用补码

可以将符号位与其他位统一处理,同时,减法也可以按照加法来处理

例如: 6 - 2 = 6 + (-2) = 4 下面的二进制码均为补码

代码解读

复制代码

0000 0110 - 0000 0010 = 0000 0110 + 1111 1110 = 0000 0100 = 4

不仅仅修复了0的符号以及存在两个编码的问题,而且能够多表示一个最低位,这就是使用原码或者反码表示的范围位[-127,+127]使用补码表示的范围位[-128,+127]

原因如下: -1-127 = -128

代码解读

复制代码

原码:  1000 0001 + 1111 1111
反码:  1111 1110 + 1000 0000
补码:  1111 1111 + 1000 0001 
=>   1 1000 0000 => -128 

-128 没有原码和反码,因为没有意义


转载来源:https://juejin.cn/post/6844903875015770125

相关文章
|
2天前
|
存储 JavaScript Java
如何在Java中计算绝对值
绝对值表示一个数离0的距离,总是非负的。在Java中,可以通过`Math.abs()`函数或`if-else`条件语句来计算绝对值。使用`Math.abs()`可直接将负数转为正数,而`if-else`则根据条件判断是否取反。本文介绍了这两种方法的具体实现步骤和代码示例,并展示了如何通过用户输入获取数值并输出其绝对值。此外,还提供了完整的代码和编译执行的方法。
如何在Java中计算绝对值
|
2月前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
70 2
|
2月前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
3月前
|
算法 Java 测试技术
🌟Java 零基础 | 详解 单目运算符
【10月更文挑战第14天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
63 7
|
3月前
|
Java 测试技术 开发者
🌟Java 零基础 | 深入理解三目运算符
【10月更文挑战第13天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
92 3
|
3月前
|
Java 测试技术 开发者
🌟Java零基础-Lambda运算符详解 🌟
【10月更文挑战第12天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
28 1
|
3月前
|
机器学习/深度学习 算法 搜索推荐
让星星⭐月亮告诉你,Java冒泡排序及其时间复杂度计算
冒泡排序是一种简单的排序算法,通过多次遍历数组,每次比较相邻元素并交换位置,将较小的元素逐步移至数组前端。第一轮结束后,最小值会位于首位;第二轮则将次小值置于第二位,依此类推。经过 (n-1) 轮遍历后,数组完成排序。冒泡排序的时间复杂度为 O(n²),在最优情况下(已排序数组)时间复杂度为 O(n)。示例代码展示了如何实现冒泡排序。
77 1
|
3月前
|
Java
JAVA易错点详解(数据类型转换、字符串与运算符)
JAVA易错点详解(数据类型转换、字符串与运算符)
64 4
|
3月前
|
安全 Java 测试技术
🌟 Java 零基础 | 详解 instanceof 运算符
【10月更文挑战第1天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
64 1
|
3月前
|
存储 Java C语言
【一步一步了解Java系列】:了解Java与C语言的运算符的“大同小异”
【一步一步了解Java系列】:了解Java与C语言的运算符的“大同小异”
49 3