前言:
今天我们对“java 位”都比较讲究,我们都想要知道一些“java 位”的相关资讯。那么小编在网上网罗了一些有关“java 位””的相关资讯,希望看官们能喜欢,我们一起来学习一下吧!难度
初级
学习时间
30分钟
适合人群
零基础
开发语言
Java
开发环境JDK v11IntelliJ IDEA v2018.31. 什么是位运算?
程序中的所有数在计算机内存中都是以二进制的形式储存的。
位运算就是直接对整数在内存中的二进制位进行操作。
比如,按位与运算本来是一个逻辑运算符,但整数与整数之间也可以进行按位与运算。举个例子,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第十九章:关系运算符、条件运算符和三元运算符
下一章
“全栈2019”Java第二十一章:流程控制语句分支结构if、if-else
学习小组
加入同步学习小组,共同交流与进步。
方式一:关注头条号gorhaf,私信“Java学习小组”。方式二:关注公众号gorhaf,回复“Java学习小组”。全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!
标签: #java 位