JAVA中位运算符合移为运算符

JAVA中位运算符合移为运算符
1: 二进制
二进制是计算机底层中最基本的运算格式,它是一种逢2进1的一种运算格式,通常以 01010111000110 的格式表示
二进制包括(源码,反码,补码)三种类型
二进制中最高位代表符号位(0:正数,1:表示负数),在二进制中从左到右 第一位代表最高位
例子:
在java中int类型占4个字节,每个字节占8位,因此一个int类型要占32位
比如1 用二进制表示为
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

二进制的计算规则
0 n d c b a
1 n d c b a

最高位: 0 表示正数, 1 表示负数
Int value ="a+b*2^1+c*2^2+d*2^3+n*2^n "  依次类推
比如:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+( 1+0*2^1+1*2^2)= 3
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
-( 1+0*2^1+1*2^2)= -3


2:二进制中 源码,反码,补码计算规则
前提 针对有符号的数(JAVA中全部都是有符号的数)
二进制中最高位代表符号位,0->正数,1->负数
正数的源码,反码,补码都一样
服务的反码=源码的符号位不变 其他为取反
负数的补码=反码+1
0的反码 补码都是0
计算机在运算的时候都是以补码的方式运算的。
例子:
A:写出2的源码,反码,补码(正数都一样,最高位代表符号位)
源码:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0

反码:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0

补码:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0

B:写出 -2的源码,反码,补码
源码: (最高位代表符号位)
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0

反码:(符号位不变,其他位取反)
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1

补码: (反码+1)
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0

3:位运算符规则
按位与(&): 两边操作数的位同位1时结果为1 否则为0
按位或(|): 两边操作数的位有一边为1 结果为1 否则为 0
按位异或(^): 两边操作数的位不同时结果为1 否则为0
按位取反(~): 0变1 ,1变0

例子:
首先重点强调,计算机在运算是都是按照 补码的方式进行运算的
2&4=?
第一步:求2的源码
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
第二步:求 2 的反码
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
第三步:求2的补码
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
第四步:求4的源码
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
第五步:求4的反码
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
第六步:求4 的补码
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
第七步:根据按位与的计算规则计算(同为1结果为1 否则为0)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
结果为
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
最后根据二进制的技术规则: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=?
同上计算结果:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
结果为:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0

+( 0+1*2^1+1*2^2….)=6;
2^4=?
同上技术结果
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
结果为
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+( 0+1*2^1+1*2^2….)=6;

~2=?
同上技术结果
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
结果为
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
此时需要注意了,因为最高位的符号位是1 表示是负数,再加上计算机的运算是用的补码(且负数的补码和源码不一致)所以此时需要将补码转换成源码进行计算,转换步骤如下
第一步:转换成反码(在此基础上-1)因为负数的补码=反码+1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
第二步:转换成源码(在此基础上,符号位不变其他位取反)
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
最后计算结果
-(1+1*2^1….)=-3

猜你喜欢

转载自zhangwei-2943-163-com.iteye.com/blog/1536148
今日推荐