二进制
十进制时:
5328 = 5 * 10^3 + 3 * 10^2 + 2 * 10^1 + 8 * 10^0
二进制是:
11011010 = 1 * 2^7 + 1 * 2^6 + 0 * 2^5 + 1 * 2^4 + 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0
二进制左移:在末尾加0(不溢出的情况下)
110101 << 1 = 1101010
二进制右移:去除末尾位数。
110101 >> 1 = 11010
左移,数值翻倍。右移动,数值减半。
右移时,在java中,最高位是符号位,0代表正数,1代表负数。
">>>"代表逻辑右移,">>"代表算术右移。
逻辑右移是高位补0,算术右移是保持符号位不变。
111.........110101 >>> 1 = 01111......11010
111.........110101 >> 1 = 11111......11010
或运算:每位做或运算,有1就1,否则0
1010110
1101100
=1111110
与运算:每位做与运算,都是1才是1,否则0
1010110
1101100
=1000100
异或运算:每位做异或运算,都相同就0,否则1
1010110
1101100
=0111010
实现十进制转二进制:
public void binaryToDecimal(int n){
for(int i = 31;i >= 0; i--)
System.out.print(n >>> i & 1);
}
分析:
java的int是32位。所以从31开始右移。
正数时:假设n = 53,就是00000....000110101
补位都是0,右移31位,左边补0,等于000000....00000,再&00000.....00001肯定等于0;
这样循环下去高位全部都是0,直到真正到有值的时候,就是到了0000...0001&00000...00001 = 1
0000...00011&0000....00001 = 1
所以得到答案0000...000110101
负数时:假设n = -53,就是1111.....111110101
补位都是1,右移31位,左边补0,等于000000....00001,再&00000.....00001肯定等于1;
这样循环下去高位全部都是1,直到真正到有值的时候,就是到了1111...11111&00000...00001 = 1
1111...11111&1111....11111 = 1
所以得到答案1111...111110101
简单来说,任何数跟1做与运算都等于自身,所以&1可以输出二进制。