Java笔记整理 —— 进制与位运算符

四种进制

进制简介

     二进制:0-1,满2进1,以0b或0B开头

     十进制:0-9,满10进1。

     八进制:0-7,满8进1,以数字0开头

     十六进制:0-9以及A(10)-F(15),满16进1,以0x或0X开头表示,A-F不区分大小写

二进制转十进制

     从最低位开始(最右边),将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和。对于八进制和十六进制转十进制,只需要把2换成8或16即可。

十进制转二进制

     将该十进制数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。对于十进制转八进制和十六进制,只需把除以2改为除以8或16。

二进制转八进制

     从低位开始(最右边),将二进制数每三位一组(因为二进制111正好为7),转成对应的八进制数即可。如果最后不够三位,在最前面补零。

     举例:0b11010101 ——  101为5,010为2,011为3,按顺序摆放,结果为 0325。

二进制转十六进制

      从低位开始,将二进制数每四位一组(因为二进制1111正好为15),转成对应的十六进制数即可。

      举例:0b11010101 —— 0101为5,1101为13即D,排好序结果为0xD5。

八进制转二进制

      将八进制数每一位,转成对应的一个三位的二进制数即可,不足三位前面补零

      举例:0237 —— 2为10(即010),3为11(即011),7为111,整体为 0b010 011 111。

十六进制转二进制

      将十六进制数每一位,转换成对应的一个四位的二进制数即可,不足四位前面补零。

       举例:0x23B —— 2为 0010,3为 0011,B为 1011,整体为 0b0010 0011 1011。

位运算符

原码、反码、补码

     1. 二进制的最高位是符号位——0表示整数,1表示负数。

     2. 正数的原码,反码,补码都一样(三码合一)。

     3. 负数的反码 = 它的原码符号位(也就是最高位)不变,其它位取反(1变0,0变1)。

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

     5. 数字0的反码,补码都是0。

     6. Java中的所有数都是有符号的。

     7. 在计算机运算的时候,都是以补码的方式进行运算的。当我们看运算结果的时候,要看它的原码。

位运算符介绍

      按位与 &:两位全是1,结果为1,否则为0。

      按位或 | :两位有一个为1,结果为1,否则为0。

      按位异或 ^ :两位一个为0,一个为1(也就是不同),结果为1,否则为0。

      按位取反 ~ :把0变成1,把1变成0。

      算数右移 >> :从最低位开始删除n个字符,如果该数为正,则高位补0,若为负数,则高位补1

      算数左移 << :从符号位右边开始删除n个字符,不分正负数,低位补0

      逻辑右移(无符号右移)>>> :从最低位开始删除n个字符,不管是正数还是负数,高位都补零。

举例:

2&3 的计算——

        2的原码为 00000000 00000000 00000000 00000010 

        由三码合一原则得,2得补码也为 00000000 00000000 00000000 00000010

        同理得3的补码为 00000000 00000000 00000000 00000011

        2&3为 00000000 00000000 00000000 00000010 (根据补码进行计算),这是一个正数,原码与补码相同,得到2&3为2。

        

~ -2  的计算:

        先得到 -2 的原码 10000000 00000000 00000000 00000010 (可以简写成 10000010)

        再得到 -2 的反码 11111111 11111111 11111111 11111101

     最后得到 -2 的补码 11111111 11111111 11111111 11111110 (补码等于反码加一)

                      ~ -2操作 00000000  00000000 00000000 00000001 这就是运算后的补码,因为操作之后变成了一个正数,因此三码合一,运算后的原码与补码相同,得到 ~ -2为 1。

~2 的计算:

     先得到 2的原码 00000000 00000000 00000000 00000010,根据三码合一原则,补码相同。

                  ~2操作 11111111 11111111 11111111 11111101  得到运算后的补码

 再得到运算后的反码  11111111 11111111 11111111 11111100 (反码等于补码加一)

 最后得到运算后的原码 10000000 00000000 00000000 00000011 (注意最高位不变) 

     根据原码计算,得到 ~2 为 3。

 

    主要就是注意:计算后得到的是补码,根据正数还是负数进行转换,转换成反码,再转换成原码,反码转原码最高位不变。

  20 >> 2 的计算:

  20的原码为 00000000 00000000 00000000 00010100 (可简写为 00010100

  20的补码与原码相同,为 00010100,向右删除2位,结果为 000101,然后在高位补上2个0(因为是正数),结果为 00000101,十进制为5(也就是20 / 2 / 2)

  -20 >> 2 的计算:

  -20的原码为 10000000 00000000 00000000 00010100 (简写为 10010100,第一位是符号位)

  -20的反码为  11101011   补码是  11101110,向右删除2位,结果为 111011,在高位补上2个1,结果为 11111011(计算后的补码),计算后的反码为 11111010,计算后的原码为 10000101,得到结果为 -5 (注意负数不一定是除以n个2,比如 -7>>2,结果为-2)。

   -20 >>> 2的计算:(注意这里负数就不能用简写了,因为补充的内容与符号位相反)

   -20的原码是 10000000 00000000 00000000 00010100

   -20的反码是 11111111 11111111 11111111 11101011

   -20的补码是 11111111 11111111 11111111 11101100

   向右删除2位,结果为 11111111 11111111 11111111 111011

   在高位补上2个0,结果为 0011111111 11111111 11111111 111011 (操作后的补码)

   这里需要注意一点—— >>>运算符的结果,就是操作后的补码!所以最终结果为 1073741819。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值