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

相关文章
|
5月前
|
Java Go 开发工具
【Java】(4)五种运算符的说明(&&、||、>=、>、<=、<)、4种控制语句(if、for、while、dowhile)、输入和输出说明
扩展类的赋值运算符不改变运算结果类型,假设最初这个变量的的类型byte类型,无论怎么进行加或追减,最终该变量的数据类型还是byte类型。注:一个表达式中有多个运算符,运算符有优先级,不确定的加小括号,优先级得到提升。当布尔表达式的结果是false的时候,选择表达式2作为整个表达式的执行结果。当布尔表达式的结果是true的时候,选择表达式1作为整个表达式的执行结果。当用户输入的时候,并且最终敲回车键的时候,键入的信息会自动赋值给a。并且,连接运算之后的结果还是一个字符串类型。表达式1 : 表达式2。
210 2
|
7月前
|
存储 缓存 算法
Java数据类型与运算符深度解析
本文深入解析Java中容易混淆的基础知识,包括八大基本数据类型(如int、Integer)、自动装箱与拆箱机制,以及运算符(如&与&&)的使用区别。通过代码示例剖析内存布局、取值范围及常见陷阱,帮助开发者写出更高效、健壮的代码,并附有面试高频问题解析,夯实基础。
|
7月前
|
机器学习/深度学习 Java 编译器
解锁硬件潜能:Java向量化计算,性能飙升W倍!
编译优化中的机器相关优化主要包括指令选择、寄存器分配、窥孔优化等,发生在编译后端,需考虑目标平台的指令集、寄存器、SIMD支持等硬件特性。向量化计算利用SIMD技术,实现数据级并行,大幅提升性能,尤其适用于图像处理、机器学习等领域。Java通过自动向量化和显式向量API(JDK 22标准)支持该技术。
323 4
|
8月前
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
440 14
|
9月前
|
人工智能 Java
Java运算符中的隐式转换
本文介绍了 Java 运算符中的隐式类型转换规则,涵盖算数、逻辑、位、关系、赋值及其他运算符。重点分析了算数和位运算符在处理小于 int 位长的数据时会自动转换为 int 类型的特性,并通过代码示例说明可能引发的类型不匹配错误。逻辑、关系、赋值及其他运算符则不涉及类型转换。总结指出,部分运算符在计算时会将小位长数据隐式转为 int 类型,结果也为 int。
109 0
|
9月前
|
人工智能 Rust Java
Java中的算数、关系、逻辑、条件、赋值 五大运算符详解
本文介绍了Java中的运算符及其优先级,包括算数运算符(如+、-、*、/、%、++、--)、关系运算符(如&lt;、&gt;、==、!=)、逻辑运算符(如&&、||、!)、条件运算符(三目运算符)和赋值运算符(如=、+=、-=等)。详细解释了每种运算符的功能与用法,例如自增自减运算符的特点、逻辑运算符的短路法运算以及位运算符的操作规则。最后还提供了运算符优先级表格,帮助开发者理解复杂表达式的计算顺序。文中提醒,在实际开发中,建议使用括号明确运算顺序以提高代码可读性。
447 0
|
12月前
|
存储 Java
# 【Java全栈学习笔记-U1-day02】变量+数据类型+运算符
本篇笔记主要围绕Java全栈学习的第二天内容展开,涵盖了变量、数据类型、运算符以及Scanner类的应用。首先介绍了变量的概念与命名规范,以及如何定义和使用变量;接着详细讲解了Java中的基本数据类型,包括整型、浮点型、字符型、布尔型等,并通过实例演示了数据类型的运用。随后,深入探讨了各类运算符(赋值、算术、关系、逻辑)及其优先级,帮助理解表达式的构成。最后,介绍了如何利用Scanner类实现用户输入功能,并通过多个综合示例(如计算圆面积、购物打折、变量交换及银行利息计算)巩固所学知识。完成相关作业将进一步加深对这些基础概念的理解与实践能力。
231 13
|
SQL IDE 算法
《从头开始学java,一天一个知识点》之:运算符与表达式:算术、比较和逻辑运算
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 这个系列为你打造Java「速效救心丸」,每天1分钟,地铁通勤、午休间隙即可完成学习。直击高频考点和实际开发中的「坑位」,拒绝冗长概念,每篇都有可运行的代码示例。明日预告:《控制流程:if-else条件语句实战》。
281 6
|
Java 程序员 数据处理
课时19:Java运算符(位运算符)
课时19介绍Java中的位运算符,涵盖进制转换、位与、位或及移位操作。重点讲解了二进制与其他进制的转换方法,通过具体范例演示了位与和位或运算的过程,并展示了八进制和十六进制的处理方式。此外,还解释了逻辑运算符(&&、||)与位运算符(&、|)的区别及其应用场景,特别是位运算在加密中的应用。
317 5
课时18:Java运算符(逻辑运算符)
课时18介绍了Java中的逻辑运算符(与、或、非)。通过范例详细讲解了非操作的使用,展示了如何正确应用逻辑非(!)。接着分别探讨了与操作(& 和 &&)及或操作(| 和 ||),强调了短路运算符(&& 和 ||)在性能和安全性上的优势。课程通过具体代码示例演示了不同逻辑运算符的效果及其应用场景。
299 5