二进制

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 简介 关于进制,我们平时接触的最多的就是十进制,用于计数。除了常用十进制,比较常用的还有跟时间相关的进制,比如七进...
    高鸿祥阅读 4,563评论 0 4
  • 转载:https://mp.weixin.qq.com/s?__biz=MzU2NjIzNDk5NQ==&mid=...
    one_zheng阅读 1,477评论 0 0
  • 小古银的官方网站(完整教程):http://www.xiaoguyin.com/C++入门教程视频:https:/...
    小古银阅读 1,993评论 0 1
  • 带着问题学习(二进制数据) 32位是几个字节? 01011100对应的十进制是多少? 00001111左移两位结果...
    yishurensheng阅读 1,752评论 0 1
  • 基础概念 进制我们日常生活中所用的多是十进制数,例如,1286是一个四位十进制数,我们可以把这个数拆开成:1x10...
    涉川gw阅读 3,627评论 0 2