前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >java中的常见运算符的计算方式

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

作者头像
闻说社
发布2024-12-31 09:48:22
发布2024-12-31 09:48:22
7500
代码可运行
举报
运行总次数:0
代码可运行

原码,反码,补码

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

原码

符号位加上真值的绝对值

代码语言:javascript
代码运行次数:0
运行
复制
 代码解读复制代码+1: 0000 0001
-1: 1000 0001
反码

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

代码语言:javascript
代码运行次数:0
运行
复制
 代码解读复制代码+1: 0000 0001
-1: 1111 1110
补码

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

代码语言:javascript
代码运行次数:0
运行
复制
 代码解读复制代码+1: 0000 0001
-1: 1111 1111

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

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

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

3 & 5 = 1

代码语言:javascript
代码运行次数:0
运行
复制
 代码解读复制代码3:	0011
5:	0101
    0001 => 1
&& (逻辑与) 两个为真才为真,如果前面的表达式为假,后面的表达式不在参与计算
| (按位或 |)一个为真即为真,例如: 1 | 1 = 1, 1 | 0 = 1, 0 | 1 = 1, 0 | 0 = 0

6 | 2 = 6

代码语言:javascript
代码运行次数:0
运行
复制
 代码解读复制代码6:  0110
2:  0010
    0110 => 6
|| (逻辑或) 一个为真即为真,后面的计算不在继续,如果前面的为假,在计算右边的表达式
^ (异或运算符) 不同的即为真,运算规则:1 ^ 0 = 1, 1 ^ 1 = 0, 0 ^ 1 = 1, 0 ^ 0 = 0

5 ^ 9 = 12

代码语言:javascript
代码运行次数:0
运行
复制
 代码解读复制代码5:  0101
9:  1001
    1100 => 12
<<(左移运算符) 将对应数字的有效位二进制往左移多少位,右边补0,正数第一位符号位补0,负数第一位符号位补1。在没有溢出的情况下,等于2的n次方。高位移出之后舍弃,低位的空挡补零

5 << 2 = 20

代码语言:javascript
代码运行次数:0
运行
复制
 代码解读复制代码5: 0000 0101 左移两位: 0001 0100 => 20
>> (右移运算符) 把有效位右移对应个数,在没有溢出的情况下相当于除以2的n次方。低位的移出舍弃,高位的空位补符号位,即正数补0,负数补1

5 >> 2 = 1

代码语言:javascript
代码运行次数:0
运行
复制
 代码解读复制代码5:  0000 0101 右移两位: 0000 0001 => 1
>>> (无符号右移) 忽略符号扩展位,0 补最高位,只是针对负数进行运算,正数的话和右移没有区别

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

6 >>> 2 = 1

代码语言:javascript
代码运行次数:0
运行
复制
 代码解读复制代码6:  0000 0110  >>>  0000 0001 => 1

-6 >>> 2 = 33

代码语言:javascript
代码运行次数:0
运行
复制
 代码解读复制代码-6  1000 0110  >>>  0010 0001 => 33
~ (取反运算符)

~5 = -6

代码语言:javascript
代码运行次数:0
运行
复制
 代码解读复制代码5:  0000 0101 ~ 1111 1010 = -6

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

为什么使用补码

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

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

代码语言:javascript
代码运行次数:0
运行
复制
 代码解读复制代码0000 0110 - 0000 0010 = 0000 0110 + 1111 1110 = 0000 0100 = 4
不仅仅修复了0的符号以及存在两个编码的问题,而且能够多表示一个最低位,这就是使用原码或者反码表示的范围位[-127,+127]使用补码表示的范围位[-128,+127]

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

代码语言:javascript
代码运行次数:0
运行
复制
 代码解读复制代码原码:  1000 0001 + 1111 1111
反码:  1111 1110 + 1000 0000
补码:  1111 1111 + 1000 0001 
=>   1 1000 0000 => -128 

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

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原码,反码,补码
    • 原码
    • 反码
    • 补码
  • java中常见运算符的计算方式
    • & (按位与 &) 两个为真才为真,例如:1 & 1 = 1, 1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0
    • && (逻辑与) 两个为真才为真,如果前面的表达式为假,后面的表达式不在参与计算
    • | (按位或 |)一个为真即为真,例如: 1 | 1 = 1, 1 | 0 = 1, 0 | 1 = 1, 0 | 0 = 0
    • || (逻辑或) 一个为真即为真,后面的计算不在继续,如果前面的为假,在计算右边的表达式
    • ^ (异或运算符) 不同的即为真,运算规则:1 ^ 0 = 1, 1 ^ 1 = 0, 0 ^ 1 = 1, 0 ^ 0 = 0
    • <<(左移运算符) 将对应数字的有效位二进制往左移多少位,右边补0,正数第一位符号位补0,负数第一位符号位补1。在没有溢出的情况下,等于2的n次方。高位移出之后舍弃,低位的空挡补零
    • >> (右移运算符) 把有效位右移对应个数,在没有溢出的情况下相当于除以2的n次方。低位的移出舍弃,高位的空位补符号位,即正数补0,负数补1
    • >>> (无符号右移) 忽略符号扩展位,0 补最高位,只是针对负数进行运算,正数的话和右移没有区别
    • ~ (取反运算符)
  • 思考关于计算机中原码,反码,补码的问题
    • 为什么使用补码
      • 可以将符号位与其他位统一处理,同时,减法也可以按照加法来处理
      • 不仅仅修复了0的符号以及存在两个编码的问题,而且能够多表示一个最低位,这就是使用原码或者反码表示的范围位[-127,+127]使用补码表示的范围位[-128,+127]
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档