您的位置 首页 java

“全栈2019”Java第二十章:按位与、按位或、异或、反码、位运算

难度

初级

学习时间

30分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

1. 什么是 位运算

程序中的所有数在计算机内存中都是以 二进制 的形式储存的。

位运算就是直接对整数在内存中的二进制位进行操作。

比如, 按位与 运算本来是一个逻辑运算符,但整数与整数之间也可以进行按位与运算。举个例子,6的二进制是110,11的二进制是1011,那么6&11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。

2.按位与&

按位与就是将二进制对应位进行逻辑与运算的结果(0表示False,1表示True,空位都当0处理)。

举例:6的二进制是110,11的二进制是1011,那么6&11的结果是?我们来运算一下。

第一步,列出6和11的二进制:

第二步,进行按位与运算:

第三步,从低位到高位进行运算,也是就从右往左开始运算,0代表假,1代表真。第一个对位的是0和1,也就是假&真,上一章我们刚刚学过逻辑与,假&真,结果为假,所以,第一个对位运算结果为0:

第四步,继续往左运算,1&1,也就是真&真,结果为真:

第五步,继续往左运算,1&0,也就是真&假,结果为假:

第六步,继续往左运算,0&1,也就是假&真,结果为假:

第七步,继续往左运算,后面都是0,也就是都是假&假,结果为假:

第八步,最终运算结果为“0000 0010”,这个二进制数转成十进制数就是2,所以6&11结果为2。

代码体现:

运行结果:

3. 按位或

按位或就是将二进制对应位进行逻辑或运算的结果(0表示False,1表示True,空位都当0处理)。

举例:6的二进制是110,11的二进制是1011,那么6|11的结果是?我们来运算一下。

第一步,列出6和11的二进制:

第二步,进行按位或运算:

第三步,从低位到高位进行运算,也是就从右往左开始运算,0代表假,1代表真。第一个对位的是0和1,也就是假|真,上一章我们刚刚学过逻辑或,假|真,结果为真,所以,第一个对位运算结果为1:

第四步,继续往左运算,1|1,也就是真|真,结果为真:

第五步,继续往左运算,1|0,也就是真|假,结果为真:

第六步,继续往左运算,0|1,也就是假|真,结果为真:

第七步,继续往左运算,后面都是0,也就是都是假|假,结果为假:

第八步,最终运算结果为“0000 1111”,这个二进制数转成十进制数就是15,所以6|11结果为15。

代码体现:

运行结果:

4. 异或

异或就是将二进制对应位进行异或运算的结果(0表示False,1表示True,空位都当0处理),对位相同,结果为0;对位不同,结果为1。

举例:6的二进制是110,11的二进制是1011,那么6^11的结果是?我们来运算一下。

第一步,列出6和11的二进制:

第二步,进行异或运算:

第三步,从低位到高位进行运算,也是就从右往左开始运算,0代表假,1代表真。第一个对位的是0和1,也就是0^1,刚刚我们说过,对位相同,结果为0;对位不同,结果为1。0和1对位不同,所以结果为1:

第四步,继续往左运算,1^1,对位相同,结果为0:

第五步,继续往左运算,1^0,对位不同,结果为1:

第六步,继续往左运算,0^1,对位不同,结果为1:

第七步,继续往左运算,后面都是0,也就是都是对位相同,结果为0:

第八步,最终运算结果为“0000 1101”,这个二进制数转成十进制数就是13,所以6^11结果为13。

代码体现:

运行结果:

异或特性

不知道大家有没有发现:

6 ^ 11 = “0000 1101”;

“0000 1101” ^ 6 = 11;

“0000 1101” ^ 11 = 6;

异或特性:a^b^b=a

特性应用:加密。例如,明文为a,密钥为b。a^b得到密文。如果其他人不知道密钥b,就无法解开明文a是什么,此时,你想解开密文,只需将密文^b,得到明文a。

5. 原码

所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

+7的原码:

-7的原码:

注意:

byte的取值范围是-2的7次方~ 2的7次方-1;总计256个数。

即:

无符号位 0~255 (因为计算机是从0开始计算的而不是1)

有符号位 -128 ~ +127

6.反码

反码:正数:正数的反码与原码相同。负数:负数的反码,符号位为“1”,数值部分按位取反。

我们来看一个例子:

+7的反码:

-7的反码:

大家既然知道反码了,那我们就来看这样一个原码:

符号为1,那就是负数;数值位都是0,那就是-0;但是-0是没有意义的,那么这个原码是多少呢?“1000 0000”代表-128;

我们知道+127的原码是:

我们将+127加上1:

+127+1=-128;很奇怪,对不对?为什么会这样呢?

8位二进制反码的表示范围:-127~+127。

原码为“1000 0000”的反码是多少:

好奇怪,这不是-127吗?怎么会是-128呢? 原来,负数的反码,要在结果上加1,也就是-128。

代码体现:

运行结果:

7.补码

在计算中,两个互补的数称为“补码”。

还是举例说明吧:

正数:正数的补码和原码相同。

+7的补码:

负数 :负数的补码则是符号位为“1”。并且,这个“1”既是符号位,也是数值位。数值部分按位取反后再在末位(最低位)加1。也就是“反码+1”。

-7的补码:

先计算-7的反码:

在计算反码+1:

8.左移<<

左移用来将一个数的各二进制位全部左移若干位。

举例,1<<2,结果是多少?

第一步,1的二进制表示:

第二步,将二进制位往左移2位:

移动之后呢,我们发现左边多出“00”2位,右边少了两位,少的2位用0来填充:

那么,结果就是“0000 0100”,1<<2=4。

代码体现:

运行结果:

9.右移>>

右移用来将一个数的各二进制位全部右移若干位。低位移出(舍弃),高位的空位补符号位,即正数补0,负数补1。

举例,4>>1,结果是多少?

第一步,4的二进制表示:

第二步,将二进制位往右移1位:

移动之后呢,我们发现右边多出“0”1位,左边少了1位,整数补0,负数补1,因为我们的4是整数,所以补0:

那么,结果就是“0000 0010”,4>>1=2。

10.无符号右移>>>

无符号右移用来将一个数的各二进制位全部右移若干位。低位移出(舍弃),高位的空位补0。

举例,4>>>1,结果是多少?

第一步,4的二进制表示:

第二步,将二进制位无符号往右移1位:

移动之后呢,我们发现右边多出“0”1位,左边少了1位,高位补0:

那么,结果就是“0000 0010”,4>>1=2。

代码体现:

运行结果:

11.&=

先进行按位与运算,再赋值。

举例:x=6;x&=11,x的值为多少?

6的二进制:

11的二进制:

6&11:

x=6&11;x=“0000 0010”,所以,x的值为2。

代码体现:

运行结果:

12.|=

先进行按位或运算,再赋值。

举例:x=6;x|=11,x的值为多少?

6的二进制:

11的二进制:

6|11:

x=6|11;x=“0000 1111”,所以,x的值为15。

代码体现:

运行结果:

13.^=

先进行异或运算,再赋值。

举例:x=6;x^=11,x的值为多少?

6的二进制:

11的二进制:

6^11:

x=6^11;x=“0000 1101”,所以,x的值为13。

代码体现:

运行结果:

14.<<=

先进行左移运算,再赋值。

举例:x=1;x<<=2,x的值为多少?

1的二进制:

1<<2:

x=1<<2;x=“0000 0100”,所以,x的值为4。

代码体现:

运行结果:

15.>>=

先进行右移运算,再赋值。

举例:x=4;x>>=1,x的值为多少?

4的二进制:

4>>1:

x=4>>1;x=“0000 0010”,所以,x的值为2。

代码体现:

运行结果:

16.>>>=

先进行无符号右移运算,再赋值。

举例:x=4;x>>>=1,x的值为多少?

4的二进制:

4>>>1:

x=4>>>1;x=“0000 0010”,所以,x的值为2。

代码体现:

运行结果:

至此,Java中按位与、按位或、异或、反码、位运算相关内容讲解先告一段落,更多内容请持续关注。

附:运算符表

答疑

如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。

上一章

下一章

“全栈2019”Java第二十一章:流程控制语句分支结构if、if-else

学习小组

加入同步学习小组,共同交流与进步。

  • 方式一:关注头条号gorhaf,私信“Java学习小组”。
  • 方式二:关注公众号gorhaf,回复“Java学习小组”。

全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

版权声明

原创不易,未经允许不得转载!

文章来源:智云一二三科技

文章标题:“全栈2019”Java第二十章:按位与、按位或、异或、反码、位运算

文章地址:https://www.zhihuclub.com/170854.shtml

关于作者: 智云科技

热门文章

网站地图