​Java四种进制及位运算介绍​

四种进制:

  1. 二进制:0,1 以0b或0B开头
  2. 十进制:0-9
  3. 八进制:0-7 以数字0开头
  4. 十六进制:0-9 及A(10)-F(15) ,以0x或0X开头,此处A-F不区分大小写
int n1 = 0b1010;    
int n2 = 1010;    
int n3 = 01010;    
int n4 = 0x1010;                              
                       //输出10进制结果         
System.out.println(n1);//10                  
System.out.println(n2);//1010                           
System.out.println(n3);//520                  
System.out.println(n4);//4112

7.1 进制转换

7.1.1 n进制转十进制

  1. 二进制转十进制:从最低位开始,将每个位的数提取出来,乘以2^(位数-1),然后求和
0b1010===>1*2^3 + 0*2^2 + 1*2^1 +0*2^0 = 8 + 0 + 2 + 0 = 10
  1. 八进制转十进制:从最低位开始,将每个位的数提取出来,乘以8^(位数-1),然后求和
0234===>  2*8^2 + 3*8^1 + 4*8^0 = 156 
  1. 十六进制转十进制:从最低位开始,将每个位的数提取出来,乘以16^(位数-1),然后求和
0x23A===> 10*16^0 + 3*16^1 +2*16^2 = 570

7.1.2 十进制转n进制

  1. 十进制转二进制:除二取余 即将该数不断除以2,直到商为0为止,将每步得到的余数倒过来就是对应的二进制
10===> 10/2=5-------0           
       5/2 =2-------1           
       2/2 =1-------0           
       1/2 =0-------1    
10===> 0b00001010   //前面四个零补齐一个字节
  1. 十进制转八进制:除八取余 即将该数不断除以8,直到商为0为止,将每步得到的余数倒过来就是对应的八进制
131===>131/8=16 ------3           
       16/8 =2  ------0           
       2/8  =0  ------2    
131===>0203
  1. 十进制转十六进制:除十六取余 即将该数不断除以16,直到商为0为止,将每步得到的余数倒过来就是对应的十六进制
237===>237/16=14 ------13        
       14/16 =0  ------14    
237===>0xED

7.1.3 二进制转n进制

  1. 二进制转八进制:从最低位开始,将二进制数每三位一组,转换为对应的八进制数即可(000代表八进制0,111代表八进制7)

0b11010101 ===>ob11(3)010(2)101(5) ==>0325

  1. 二进制转十六进制:从最低位开始,将二进制数每四位一组,转换为对应的十六进制数即可(0000代表十六进制0,1111代表十六进制F)

0b11010101 ===>ob1101(D)0101(5) ==>0xD5

7.1.4 n进制转二进制

  1. 八进制转二进制:将八进制每一位,转换成对应的一个3位的二进制数

0237 ===>2(010)3(011)7(111) ==>0b10011111

  1. 十六进制转二进制:将十六进制每一位,转换成对应的一个4位的二进制数

0x23B ===>2(0010)3(0011)B(1011) ==>0b001000111011

7.2 位运算

7.2.1 原码、反码、补码

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

  1. 正数的原码、反码、补码都一样(三码合一)
  2. 负数的反码=它符号位不变,其他位取反
  3. 负数的补码=它的反码+1 负数的反码=它的补码-1
  4. 0的反码、补码都是0
  5. java中的数都是有符号的
  6. 计算机运算时,都是以补码的方式运算
  7. 看运算的结果时,要看它的原码
    有了补码有以后,正数和负数的运算统一起来

7.2.2 位运算符

& 、| 、^ 、~ 、>> 、<< 、和>>>

一、& 、| 、^ 、~

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

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

按位异或^:两位不同为1,相同为0

按位去反~:0->1;1->0

//按位与:
    /**
     * 2的原码为 00000000 00000000 00000000 00000010
     * 根据规则 2的补码为 00000000 00000000 00000000 00000010
     * 3的原码为 00000000 00000000 00000000 00000011
     * 根据规则 3的补码为 00000000 00000000 00000000 00000011
     * 补码进行运算
     * 按位与&结果 00000000 00000000 00000000 00000010
     * 转成原码 00000000 00000000 00000000 00000010
     */
    System.out.println(2&3);//2
//按位取反:
    /**
     * -2的原码为 10000000 00000000 00000000 00000010
     * 根据规则 -2的反码为 11111111 11111111 11111111 11111101
     * 根据规则 -2的补码为 11111111 11111111 11111111 11111110
     * 补码进行运算
     * 按位取反的结果为 00000000 00000000 00000000 00000001
     * 转成原码 00000000 00000000 00000000 00000001
     */
    System.out.println(~-2);//1
//按位取反:
    /**
     * 2的原码为 00000000 00000000 00000000 00000010
     * 根据规则 2的补码为 00000000 00000000 00000000 00000010
     * 补码进行运算
     * 按位取反的结果为 11111111 11111111 11111111 11111101
     * 转成反码为 11111111 11111111 11111111 11111100
     * 转成原码 10000000 00000000 00000000 00000011
     */
    System.out.println(~2);//-3
//按位或:
    /**
     * 2的原码为 00000000 00000000 00000000 00000010
     * 根据规则 2的补码为 00000000 00000000 00000000 00000010
     * 3的原码为 00000000 00000000 00000000 00000011
     * 根据规则 3的补码为 00000000 00000000 00000000 00000011
     * 补码进行运算
     * 按位或结果 00000000 00000000 00000000 00000011
     * 转成原码 00000000 00000000 00000000 00000011
     */
    System.out.println(2|3);//3
//按位异或:
    /**
     * 2的原码为 00000000 00000000 00000000 00000010
     * 根据规则 2的补码为 00000000 00000000 00000000 00000010
     * 3的原码为 00000000 00000000 00000000 00000011
     * 根据规则 3的补码为 00000000 00000000 00000000 00000011
     * 补码进行运算
     * 按位异或结果 00000000 00000000 00000000 00000001
     * 转成原码 00000000 00000000 00000000 00000001
     */
    System.out.println(2^3);//1

二、>> 、<< 、 >>>

算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位

算术左移<<: 符号位不变,低位补0

无符号右移(逻辑右移):低位溢出,高位补0

如:1>>2==>00000000 00000000 00000000 00000001--->00000000 00000000 00000000 00000000 本质是1 / 2 / 2=0

​ 1<<2==>00000000 00000000 00000000 00000001--->00000000 00000000 00000000 00000100 本质是1 * 2 * 2=4

​ 4<<3==>00000000 00000000 00000000 00000100--->00000000 00000000 00000000 00100000 本质是4 * 2 * 2 * 2=32

​ -1>>2==>10000000 00000000 00000000 00000001--->10000000 00000000 00000000 00000001

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值