逻辑运算与移位运算

源码:正数的补码与原码相同例+7 源码:00000111 补码 :00000111  (用8位二进制表示一个数)


负数的补码:
   符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
   -7 源码: 10000111 ,其绝对值为00000111  取反加一:11111001 为-7补码

已知一个数的补码,求原码的操作分两种情况:
 
(1)如果补码的符号位为“0”,表示是一个正数,其原码就是补码。 
 (2)如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。


补码:00001111  ->原码:00001111
补码:11110001 ->  01110001 取反加一 ->   原码:10001111


逻辑运算:异或("^")
其运算法则为: a^b=(a' and b) or (a and b')   (a'为非a)
0 ^ 1 得 1, 1 ^ 1 得 0 ,0 ^ 0 得 0,1 ^ 0 得 1

 左移位:<<,有符号的移位操作
左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用0补充
右移位:>>,有符号的移位操作
右移操作是将运算数的二进制码整体右移指定位数,右移之后的空位用符号位补充,
如果是正数用0补充,负数用1补充。
System.out.println(3<<2);//3左移2位       0000 0011  ==>  000000 1100
System.out.println(-3<<2);//-3左移2位  1000 0011  ==> 1000 001100
System.out.println(6>>2);//6右移2位    0000   0110   ==> 0000 0001|10
System.out.println(-6>>2);//-6右移2位  
1000 0110--->0000 0110(绝对值)--> 1111 1010(补码)-->1111 1110 |10
--> 1111 1110 
求1111 1110的源码--> 0111 1110--> 1000 0010--> -2


无符号的移位“>>>”:无符号的移位只有右移,没有左移使用“>>>”进行移位,都补充0
System.out.println(6>>>2);  	//1
System.out.println(-6>>>2);     //1073741822


00000000 00000000 00000000 00000110 +6在计算机中表示方法
11111111 11111111 11111111 11111001
11111111 11111111 11111111 11111010 -6(补码)在计算机中的表示
0011111111 11111111 11111111 11111010 右移两位,补充0,结果为1073741822







你可能感兴趣的:(位运算,逻辑运算)