二进制

作者: csexttt | 来源:发表于2019-04-24 18:10 被阅读0次

十进制时:
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可以输出二进制。

相关文章

网友评论

      本文标题:二进制

      本文链接:https://www.haomeiwen.com/subject/mvaggqtx.html