20.1 二进制基本概念
二进制是逢2进位的进位制,0、1是基本算符。
现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。二进制(Binary)数用0和1两个数字及其组合来表示任何数。进位规则是“逢2进1”,数字1在不同的位上代表不同的值,按从右至左的次序,这个值以两倍递增。
20.2 原码、反码、补码
网上对原码、反码、补码的解释过于复杂,这里精简成7句话:
对于有符号的而言(java的数都是有符号的,C的有些没有):
1、二进制的最高位是符号位:0表示整数,1表示负数
2、正数的原码、反码、补码都一样
3、负数的反码=原码符号位不变,其它位取反
4、负数的补码=反码+1
5、0的反码、补码都是0
6、Java没有无符号数,换言之,java中的数都是有符号的
7、在计算机运算的时候,都是以补码的方式来运算的。
20.3 位运算符
Java中有4个位运算,分别是“按位与&、按位或|、按位异或^、按位取反~”,它们的运算规则是:
按位与&:两位全为1,结果为1
按位或|:两位有一个为1,结果为1
按位异或^:两位有一个为0,一个为1,结果为1
按位取反~:0->1,1->0
20.4 移位运算符
Java中有3个移位运算符。
>>、<<表示算术右移和算术左移,运算规则:
算术右移:符号位不变,低位溢出,并用符号位补溢出的高位
算数左移:符号位不变,低位补0(技巧:左移1位相当于十进制的数字乘以2)
>>>表示逻辑右移,运算规则:
低位溢出,高位补0
演示代码如下:
1 /**日期:2016-03-07 2 * 功能:移位运算符和位运算符的演示 3 */ 4 package test; 5 public class Demo1 { 6 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 10 //算术右移 11 System.out.println("算术右移:"); 12 System.out.println("1>>2="+(1>>2)); 13 System.out.println("-1>>2="+(-1>>2)); 14 System.out.println(); 15 //算术左移 16 System.out.println("算术左移:"); 17 System.out.println("1<<2="+(1<<2)); 18 System.out.println("-1<<2="+(-1<<2)); 19 System.out.println(); 20 //逻辑右移 21 System.out.println("逻辑右移:"); 22 System.out.println("3>>>2="+(3>>>2)); 23 System.out.println(); 24 25 System.out.println("按位与:"); 26 System.out.println("2&3="+(2&3)); 27 System.out.println("13&7="+(13&7)); 28 System.out.println(); 29 30 System.out.println("按位或:"); 31 System.out.println("2|3="+(2|3)); 32 System.out.println("5|4="+(5|4)); 33 System.out.println(); 34 35 System.out.println("按位取反:"); 36 System.out.println("~2="+(~2)); 37 System.out.println("~-5="+(~-5)); 38 System.out.println(); 39 40 System.out.println("按位异或:"); 41 System.out.println("-3^3="+(-3^3)); 42 System.out.println(); 43 } 44 }
运行结果如下:
1 算术右移: 2 1>>2=0 3 -1>>2=-1 4 5 算术左移: 6 1<<2=4 7 -1<<2=-4 8 9 逻辑右移: 10 3>>>2=0 11 12 按位与: 13 2&3=2 14 13&7=5 15 16 按位或: 17 2|3=3 18 5|4=5 19 20 按位取反: 21 ~2=-3 22 ~-5=4 23 24 按位异或: 25 -3^3=-2