Binnary(2进制) 基础

1 什么是2进制: 逢2进一的计数规则 数字: 0 1 权: 128 64 32 16 8 4 2 1 基数2的幂。
2进制与10进制直接的转换 可以表示相同的数字(相同的个数)
(1) 128 64 32   16 8   4   2    1
        0   1    0    1   0   1   0   1(2) = 64 + 4 + 1 = 69(10)
(2) 128  64  32  16   8   4  2  1           55(10) = 1 1 0 1 1 1(2)
                     1    1   0   1   1  1
                    23   7        3   1   0(55-32)
3. Java 提共了Integer.toBinaryString(i)API 将内存中的2进制实际存储情况,进行显示
System.out.println(Integer.toBinaryString(i));(输出二进制数)

4. 使用2进制
计算机内部没有10进制,只有2进制! Java 利用算法(方法)支持了10进制!
Integer.toString() 将内存中的2进制转换为10进制 的字符串进行输出
Integer.parseInt() 将10进制的字符串,转换为2 进制的数字。
java 会自动的调用这两个方法,实现转换 所以感觉上Java是认识10进制的!
int i = 237;//自动的调parseInt
System.out.println(i);//237 自动toString
二)补码:是一个算法:将正数模拟为有符号数
1 节省了成本:利用正数表示负数
2 补码是软件实现的! parseInt 和 toString
3补码的算法原理: 4位数补码为例:阐述补码的工作原理 规定:超过4位数自动溢出。
在这里插入图片描述
补码盘:最大值第一位是0其他位数是1 补码盘最小值第一位是1其他是0;-1都是1
补码的优点:

  1. 在不超过范围情况下支持4则运算。 2) 利用算法实现了负数计算。
    补码的缺点: 1) 补码是有范围数,不能超范围计算 超范围,得到溢出的结果!
    补码的对称性:-n = ~n + 1 A 是补码的特性,不是数学规则! B 两个极值无效 (max min 0 -1)
    一个数取反+1是它的相反数:max+1=min n=n+(max+1)2m (max+1)2一圈,m圈
    三)16进制:16进制用于2进制的缩写!
    1.16进制规则:逢16进1 数字:0 1 2 3 4 5 6 7 8 9 a b c d e f 权:256 16 1
    2.关键缩写表格
    0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7
    1000 8 1001 9 1010 a 1011 b 1100 c 1101 d 1110 e 1111 f
    3.a0(16) = 10 * 16 = 160(10) 11000001(2) = c1(16)
    128+64+1 12
    16+1 = 193(10)
    Int max :01111111 11111111 11111111 11111111=int max = 0x7fffffff;
    7 f f f f f f f
    Int min := min = 0x80000000;
    Int =-1;11111111 11111111 11111111 11111111
    f f f f f f f f
    四)2进制的计算
    ~ 取反运算 | 或运算 & 与运算 >>> 逻辑右移运算 >> 数学右移位运算 << 左移动运算
    1.~ 取反运算:~ 将每个2进制的数字 0->1 1->0 -n = ~n + 1
    一个数取反+1是它的相反数:max+1=min n=n+(max+1)2m (max+1)*2一圈,m圈
    i = 0xd5;
    i=00000000 00000000 00000000 11010101;
    ~i=11111111 11111111 11111111 00101010;
    2.| 或运算(逻辑加)见1则1:0 | 0 = 0 0 | 1 = 1 1 | 0 = 1 1 | 1 = 1
    案例:如下案例的逻辑意义:将n和m拼接为i:或运算经常用于数据的拼接!
    n = 00000000 00000000 11100101 00000000(n = 0xe500;)
    | m = 00000000 00000000 00000000 11011101(m = 0xdd;)

i = 00000000 00000000 11100101 11011101(i = n | m;// e5dd)
3. & 与运算 :见0则0 0 & 0 = 0 0 & 1 = 0 1 & 0 = 0 1 & 1 = 1
案例:(常用来截取数据) 如下运算的逻辑意义:将n的后8位截取下来
n = 00100100 10100100 00111101 11010110(n = 0x24a43dd6)
m = 00000000 00000000 00000000 11111111(m = 0xff)
&----------------------------------------
i = 00000000 00000000 00000000 11010110(i = n & m; // i = 0xd6)
4. >>> 逻辑右移运算 数字的每个数字向右移动,左侧填充0右边去除,位数不边
n = 00101011 10110101 01010010 11001101
m=n>>>1=000101011 10110101 01010010 1100110
m=n>>>2=0000101011 10110101 01010010 110011
m=n>>>8=00000000 00101011 10110101 01010010
n = 0x2bb555cd;
m = n>>>1;
思考如下代码的逻辑意义:?& 与运算 :见0则0
int b1 = n & 0xff;
int b2 = (n>>>8) & 0xff; 00000000 00000000 00000000 11111111(m = 0xff)
int b3 = (n>>>16) & 0xff;
int b4 = (n>>>24) & 0xff;
如上代码的逻辑意义是将n拆分为4段! 将一个int拆分为4个byte数据
5. << 左移动运算
int b1 = 0xcd;
int b2 = 0x55;
int b3 = 0xb5;
int b4 = 0x2b;
将b1 b2 b3 b4 拼接为一个int,如何做 i= b1 | (b2<<8) | (b3<<16) | (b4<<24);
6.>> 数学右移动运算:
正数时候高为0时候 >> 高位补0 负数时候高为1时候 >> 高位补1
n = 010111010100101010100010111010110 正数
n = 110111010100101010100010111010110负数
7. << 左移动运算的数学意义

  1. 10进制移动小数点运算: 122748. 小数点向右移动一位 1227480. 原始数据10(基数)
    如果小数点位置不动,可以看做数字向 左移动:10进制数字向左移动一次结果是原始数据
    10!
    2). 在2进制中:2进制数字向左移动一次结果是原始数据2!结果是:原始数据(m)2n次幂(n是移动次数)
    m
    2 =m<<1 m
    4 =m<<2 m*8 =m<<3
  1. 右移动运算的数学意义:运算的数学意义:原数据/2n次幂, 结果向小方向取整数。
    5 >> 1 -> 2 -5 >> 1 -> -3

  2. 逻辑右移运算和<< 左移动运算:运算的用途
    将数字(int long)进行拆分为byte 将byte合并为数字 int long

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值