• 进制详解


    位数:从右到左为由低到高。最高位就是最左边的第一位

    1.二进制的最高位是符号位:0正数,1负数

    2.正数的原码,补码,反码都一样

    3.负数的反码=它原码符号位不变,其他位取反(0->1,1->0)。注意反码和取反(~)运算的区别,反码符号位不变,其他取反。而取反运算包括符号位都要取反

    4.负数的补码=它的反码+1 

    5.0的反码,补码都是0

    6.java没有无符号数,java的数都是有符号的

    7.计算机运算的时候,都是以补码的方式运算

    如:int a=1;最低位表示2^0,就是最后一位:2^(1-1) ,倒数第二位:2^(2-1),倒数第三位:2^(3-1)

    00000000 00000000 00000000 00000001 –>表示1*2^0

    00000000 00000000 00000000 00000011->表示1+1*2^1  

    00000000 00000000 00000000 00000111->表示1+ 1*2^1  +1*2^2

     

    求:1+1=?,因为两个都是正数,所以计算的时候虽然是以补码的方式,但正数的补码和原码一样

    00000000 00000000 00000000 00000001

    +00000000 00000000 00000000 00000001

           00000000 00000000 00000000 00000010(逢二进一,上下1+1=2

     =0*2^0+1*2^1=2

    求:1-2=?,实际就是求1+-2),1的补码就是原码,-2的补码是它的反码+1,而它的反码是符号位不变,其他取反

    1的原码:00000000 00000000 00000000 00000001 

    1的补码:00000000 00000000 00000000 00000001 

    -2的原码:   10000000 00000000 00000000 00000010

    -2的反码:  11111111 11111111 11111111 11111101

    -2的补码=反码+1                  

    11111111 11111111 11111111 11111101

    +00000000 00000000 00000000 00000001

    =11111111 11111111 11111111 11111110       

     

    1+-2=

    1的补码+-2)的补码:

    00000000 00000000 00000000 00000001

    + 11111111 11111111 11111111 11111110

    =11111111 11111111 11111111 11111111 (因为符号位(最高位)是1,所以表示负数,所以运算的结果是为补码,所以要将补码转成原码:反码=补码-1,然后将反码的符号位不变,其他位取反)

      11111111 11111111 11111111 11111111

    -         00000000 00000000 00000000 00000001

    =  11111111 11111111 11111111 11111110(反码)->进行取反

       10000000 00000000 00000000 00000001 (原码)

    = -1

    位运算符(~|&^

    求:~2=?(取反,0->1,1->0,符号位一样要去反)注意反码和取反的区别,反码符号位不变,其他取反

    2的原码:                     00000000 00000000 00000000 00000010

    取反:          11111111 11111111 11111111 11111101 (符号位是1,所以是负数,得到的那就是补码)

    反码=补码-1   -00000000 00000000 00000000 00000001

                          =  11111111 11111111 11111111 1111100

    原码=反码取反:  10000000 00000000 00000000 00000011

                   =-1+1*2^1

                                    =-3

    求:~-5=?(取反,0->1,1->0,符号位一样要去反),对负数取反,就是对负数的补码进行取反

    -5的原码:10000000 00000000 00000000 00000101

    -5的反码:11111111 11111111 11111111 11111010      (反码=符号位不变,其他取反)

                    +   00000000 00000000 00000000 00000001    

    -5的补码:11111111 11111111 11111111 11111011

    -5的补码进行取反

    00000000 00000000 00000000 00000100(符号位为正数,补码和原码一样)

    =4

    求:2&3=?按位与(两位全为1,则为1

    200000000 00000000 00000000 00000010

    300000000 00000000 00000000 00000011

    =  00000000 00000000 00000000 00000010

    =2

    求:2|3=?按位或(有一个1,则为1

    =  0000000 00000000 00000000 00000011

    =3

     

    :-3^3=?(异或,两个不同才为1

    -3的原码:10000000 00000000 00000000 00000011

    -3的反码:11111111 11111111 11111111 11111100

    -3的补码:11111111 11111111 11111111 11111101

    3的补码: 00000000 00000000 00000000 00000011

    异或:     11111111 11111111 11111111 11111110(最高位为1,是负数,得到的是补码,将他转成原码)

    反码:     11111111 11111111 11111111 11111110

               00000000 00000000 00000000 00000001

                                =11111111 11111111 11111111 11111101(减时:将11111110退一位(不就是变成2吗)类似11111102

    然后11111102-00000001=11111101

    原码:    10000000 00000000 00000000 00000010(反码取反。符号位不变)

                         =-2

    移位运算(<<,>>>,>>)在内存中运算,非常快

    移位运算都是以补码的形式运算

    求:1>>2(低位溢出,符号位不变,并用符号位补溢出的最高位):2表示两位

    1的补码:

    0000000 00000000 00000000 00000001 然后向右移2位,则1跑出了32位中,其他的用0补齐

    0(00)00000 00000000 00000000 00000000 0101跑出去了,左边的向右移2位,符号位不变,并用符号位补最高位(因为0为符号位,所以用0去补)所以结果为0

     

    求:-1>>2

    -1的补码:11111111 11111111 11111111 11111111 向右移2位,符号位不变,其他的用符号位补齐

                            1(11)1111 11111111 11111111 11111111 1111被溢出来了,然后用符号位补齐。因为符号位为1,所以用1去补齐。因为符号位为1,所以为负数,得到的是补码,所以将补码得到原码

    补码:11111111 11111111 1111111 11111111

    反码:11111111 11111111 1111111 11111110

    原码:10000000 00000000 00000000 00000001

    =-1

    求:1<<2 (符号位不变,低位补0,移动一位相当于乘以2^1,移动2位相当于乘以2^2

    所以1*2^2=4

    :2<<2 = 2*2^2=8

      求:-1<<2 ->-1*2^2=-4

      : 2<<4-> 2*2^4=32

      求:1<<1  -> 1*2^1=2

     

     

     求:3>>>2 (低位溢出,高位补0

    3的补码:00000000 00000000 00000000 00000011

    向右移2为:0(00)00000 0000000000 00000000 00000000 11

          =0

    F表示一个16进制,因为一个字节一个8位,所以一个字节等于2个16位。

    向右移24为,就是将01111111 11111111 11111111 11111111变为00000000 00000000 00000000 01111111

    将第一位(最高位)的第一个0移动到最后一位(最低位)的第一个0。从左到右:位数由高到低

     

    想要把一个int值存入流中,就要像上面一样存,先i>>>24I,因为int1个字节,write只能一个一个字节的存,所以先把最低位的1个字节存进去后,再存高位的

  • 相关阅读:
    华为Mate8 NFC 时好时坏,怎么解决呢?
    linux下使用FreeRDP 连接 Windows 远程桌面
    Linux下如何查看系统启动时间和运行时间以及安装时间
    运维监控系统之Open-Falcon
    gitlab之邮箱配置
    Ubuntu系统日志
    安装docker-compose的两种方式
    Linux用户配置sudo权限(visudo)
    Centos7下部署两套python版本并存
    线上mongodb 数据库用户到期时间修改的操作记录
  • 原文地址:https://www.cnblogs.com/lirenzhujiu/p/5751747.html
Copyright © 2020-2023  润新知