[java]
package test;
/*
* 作者:钟志钢
* 内容:二进制(原码,反码与补码),位算符,移位运算
* 时间: 2013-1-23 www.zzzyk.com
* 1. >> 算术右移 ,符号位不变,低位溢出,并用符号位补缺少高位
* << 算术左移 , 符号位不变,低位补零
* >>> 逻辑右移, 低位溢出,高位补0
* 2,位运算:~1, 按位取反 ,(0-->1, 1-->0)
* -3^3 按位异或,一个为0, 一个为1,则为1;
* 1&3 , 按位与,两位全为1.则结果为1;
* 1|3 , 按位或, 两位有一个为1, 则为1;
* 3,二进制反补码规则:对于有符号的而言;
* 1,最高位是符号符号位,0是正,1为负。
* 2,正数或0的原码,反码与补码都一样。
* 3,负数的反码=它的原码符号位不变,其它取反(0-->1, 1-->0)
* 4,负数的补码=反码 + 1;
* 5, java中没有无符号数,即java中的数都是有符号数
* 6, 计算机运算时都是以补码的方式运算的;
*
*
*
*/
public class 二进制 {
/**
* @param args
*/
public static void main(String[] args) {
二进制 er = new 二进制();
}
public 二进制 (){
//移位运算
byte a = 1 >> 2;//低位溢出,并用符号位补缺少高位
//1 --> 00000001 -补码-> 00000001 -移位-> 00000000.01 --> 00000000 = 0
byte aa = 8 >> 2;//低位溢出,并用符号位补缺少高位
//8 --> 00001000 -补码-> 00001000 -移位-> 00000010.00 --> 00000010 = 2=8开平方
byte b = -1 >> 2;
//-1 --> 10000001 -补码-> 11111111 -移位-> 11111111.11 -补码-> 10000001 = -1
byte c = 1 << 2;//高位溢出,0补低位
//1 --> 00000001 -补码-> 00000001 -移位-> 00000100 --> 4 = 2平方
byte d = -1 << 2;
//-1 --> 10000001 -补码-> 11111111 -移位-> 11111100 -补码-> 10000100 = -4
byte e = 3 >>> 2;//低位溢出,高位补0
//3--> 00000011 -逻辑移位-> 00000000,11--> 00000000=0
int ee = -3 >>> 2;//低位溢出,高位补0
//3--> 1000-24个0-0011 -->111-24个1-11101-逻辑移位-> 0011-24个1-1111,01--> 0011-24个1-1111
System.out.println("a(1 >> 2)= " + a);
System.out.println("b(-1 >> 2)= " + b);
System.out.println("c(1 << 2)= " + c);
System.out.println("d(-1 << 2)= " + d);
System.out.println("e(3 >>> 2)= " + e);
System.out.println("ee(-3 >>> 2)= " + (-3 >>> 2));
//二进制计算过程
byte f = 1;
byte g = 2;
/*f = 00000001;//byte为一个字节,八位
*g = 00000010
*f - g --> f + (-g)
*-g = 10000010
*首先对g取反为:11111101
*再取补码: 11111110
*f的反码为本身00000001
*f - g = 11111111
*再取反回来: 10000000 --> 10000001
*即 f - g = -1
*/
//位运算:
byte h = ~2;
//2 --> 00000010 -取反-> 11111101 -补到原先取反-> 10000010 -再加1-> 10000011 --> 3
byte i = 2 & 3 ;//两个为1则为1,否则为0
//2 --> 00000010, 3 --> 00000011; 2 & 3 = 00000010 --> 2
byte j = 2 | 3;//只要有一个为1就为1,否则为0
//2 --> 00000010, 3 --> 00000011; 2 | 3 = 00000011 --> 3
byte k = ~-5;
//-5--> 10000101 -补码-> 11111011-取反-> 00000100 -补码-> 00000100 --> 4
byte l = 13 & 7 ;
byte m = 5 | 4;
byte n = -3 ^ 3;//不同则为1,相同则为0
//-3 --> 10000011 -补码-> 11111101,3-->00000011,-3^3-->11111110-补码->10000010 = -2
System.out.println("h(~2)= " +h);
System.out.println("i(2 & 3)= " +i);
System.out.println("j(2 | 3)= " +j);
System.out.println("k(~-5)= " +k);
System.out.println("l(13 & 7)= " +l);
System.out.println("m(5 | 4)= " +m);
System.out.println("n(-3 ^ 3)= " +n);
}
}