Java二进制与位运算

进制

  1. 二进制:0-1,常以0b,0B开头
  2. 十进制,0-9
  3. 八进制,0-7,常以数字0开头
  4. 十六进制,0-9及A(10)-F(15),满16进一,以0x或0X开头

使用

二,八,十六进制转十进制,相乘相加;大转小用相除

十进制转二,八进制,十六进制,比如521=0B1000001001=01011=0x209

二转八,十六进制(反过来同理), 该二进制0b1(1) 000(0) 001(1) 001(1)=01011八进制

​ 该二进制0b 10(2) 0000(0) 1001(9)=0x209十六进制

八,十六进制转二,该八进制0 1 (001) 0 (000) 1(001) 1(001) =0b1000001001 二进制

位运算

在Java中有七个位运算符 按位与&,按位或|,按位异或^ 按位取反~,<<、>>>

位运算符

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

  • 按位或|:其中一位是1,结果为1,否则为0

  • 按位异或^:其中一位是1,另一个是0,结果为1,否则为0

  • 按位取反~:0变1,1变0

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

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

  • 逻辑右移>>> : 也叫无符号右移,低位溢出,高位补0

  • 特别注意 没有<<< 符号

原码、反码、补码

规则
  1. 二进制最高位是符号位:0表示正数,1表示负数
  2. 正数的原码、反码、补码都一样
  3. 0的反码、补码都是0
  4. 负数的反码= 原码符号位不变,其他位取反(1的反码就是0)
  5. 负数的补码=反码+1
  6. java没有无符号数,所以java的数都是有符号的
  7. 在计算机运算时,都是以补码的方式来运算。
  8. 运行结果看原码

int a = 1>>2;表示1向右位移两位
int b = -1<<2,表示-1向左位移两位
int c = 2>>>4,表示2算术位移4位
~2,表示按位取反操作
2&3,表示2按位与3
2|3,表示2按位或3
-3^5,表示-3按位异或5

推导 2 & 3
求出2按位与3的结果
    
    为什么先要获取23的补码,因为计算机在运算时,是以补码运算的。
    
    1.先得到2的补码。  又因为正数的原码=反码=补码,故先求出2的原码
    因为2int类型,有4个字节,
    一字节八位得2的原码 00000000 00000000 00000000 00000010 ,
    注意第一个0是代表符号位,为正数
    
    2.得出3的补码。
    00000000 00000000 00000000 00000011
    
    3. 2按位与3结果 补码是 00000000 00000000 00000000 00000010
    
    4.运算结果只看原码,将上面的补码转换成原码 00000000 00000000 00000000 00000010  ,转成十进制结果是2
    
    System.out.println(2&3);   2

练习位运算
1. System.out.println(~-2);
分析:~是按位取反符号,-2是代表是负数。负数的补码=反码+1,反码就是 [符号位不变,原码0110],已知原码求补码?
-2的原码是 10000000 00000000 00000000 00000010
-2的反码是 11111111 11111111 11111111 11111101
-2的补码是 11111111 11111111 11111111 11111110
按位取反~-200000000 00000000 00000000 00000001
原码是 00000000 00000000 00000000 00000001
System.out.println(~-2);    1

2.System.out.println(~2);
分析 : ~按位取反 , 2是正数,符号位是0, 原码=补码=反码,因运算时,是以补码运算, 已知原码求补码?
2的原码是 00000000 00000000 00000000 00000010
2的补码是 00000000 00000000 00000000 00000010
按位取反~211111111 11111111 11111111 11111101
将  补码 11111111 11111111 11111111 11111101 转换为反码
反码是补码-1  11111111 11111111 11111111 11111100
原码是 10000000 00000000 00000000 00000011
System.out.println(~2);    -3

3.System.out.println(2|3); 3
4.System.out.println(2^3); 1

-----------------------------------------------------------------------------------------
int a = 1>>2; 1算术右移2位
先求1的补码 00000000 00000000 00000000 00000001 
右移两位 00000000 00000000 00000000 00000000 也表示 1/2/2,就像十进制百位上的数变成个位,除于他的进制10
1>>2 结果是 0

int b = 1<<2 ;1算术左移 2位
先求1的补码 00000000 00000000 00000000 00000001 
左移两位 00000000 00000000 00000000 00000100 也表示 1*2*2,就像十进制个位上的数变成百位,乘于他的进制10
1<<2 结果是 4

4 << 3 = 4*2*2*2=132
15 >> 2 = 15/2/2=3



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值