JAVA中位运算符合移为运算符
JAVA中位运算符合移为运算符
1: 二进制
二进制是计算机底层中最基本的运算格式,它是一种逢2进1的一种运算格式,通常以 01010111000110 的格式表示
二进制包括(源码,反码,补码)三种类型
二进制中最高位代表符号位(0:正数,1:表示负数),在二进制中从左到右 第一位代表最高位
例子:
在java中int类型占4个字节,每个字节占8位,因此一个int类型要占32位
比如1 用二进制表示为
00000000000000000000000000000001
二进制的计算规则
0ndcba
1ndcba
最高位: 0 表示正数, 1 表示负数
Int value ="a+b*2^1+c*2^2+d*2^3+n*2^n " 依次类推
比如:
00000000000000000000000000000101
+( 1+0*2^1+1*2^2)= 3
10000000000000000000000000000101
-( 1+0*2^1+1*2^2)= -3
2:二进制中 源码,反码,补码计算规则
前提 针对有符号的数(JAVA中全部都是有符号的数)
二进制中最高位代表符号位,0->正数,1->负数
正数的源码,反码,补码都一样
服务的反码=源码的符号位不变 其他为取反
负数的补码=反码+1
0的反码 补码都是0
计算机在运算的时候都是以补码的方式运算的。
例子:
A:写出2的源码,反码,补码(正数都一样,最高位代表符号位)
源码:
00000000000000000000000000000010
反码:
00000000000000000000000000000010
补码:
00000000000000000000000000000010
B:写出 -2的源码,反码,补码
源码: (最高位代表符号位)
10000000000000000000000000000010
反码:(符号位不变,其他位取反)
11111111111111111111111111111101
补码: (反码+1)
11111111111111111111111111111110
3:位运算符规则
按位与(&): 两边操作数的位同位1时结果为1 否则为0
按位或(|): 两边操作数的位有一边为1 结果为1 否则为 0
按位异或(^): 两边操作数的位不同时结果为1 否则为0
按位取反(~): 0变1 ,1变0
例子:
首先重点强调,计算机在运算是都是按照 补码的方式进行运算的
2&4=?
第一步:求2的源码
00000000000000000000000000000010
第二步:求 2 的反码
00000000000000000000000000000010
第三步:求2的补码
00000000000000000000000000000010
第四步:求4的源码
00000000000000000000000000000100
第五步:求4的反码
00000000000000000000000000000100
第六步:求4 的补码
00000000000000000000000000000100
第七步:根据按位与的计算规则计算(同为1结果为1 否则为0)
00000000000000000000000000000010
00000000000000000000000000000100
结果为
00000000000000000000000000000000
最后根据二进制的技术规则:Int value ="a+b*2^1+c*2^2+d*2^3+n*2^n " 依次类推
+( 0+0*2^1+0*2^2….)=0;
2|4=?
同上计算结果:
00000000000000000000000000000010
00000000000000000000000000000110
结果为:
00000000000000000000000000000110
+( 0+1*2^1+1*2^2….)=6;
2^4=?
同上技术结果
00000000000000000000000000000010
00000000000000000000000000000110
结果为
00000000000000000000000000000110
+( 0+1*2^1+1*2^2….)=6;
~2=?
同上技术结果
00000000000000000000000000000010
结果为
11111111111111111111111111111101
此时需要注意了,因为最高位的符号位是1 表示是负数,再加上计算机的运算是用的补码(且负数的补码和源码不一致)所以此时需要将补码转换成源码进行计算,转换步骤如下
第一步:转换成反码(在此基础上-1)因为负数的补码=反码+1
11111111111111111111111111111100
第二步:转换成源码(在此基础上,符号位不变其他位取反)
10000000000000000000000000000011
最后计算结果
-(1+1*2^1….)=-3