进制转换、运算

一、进制转换

进制符号:二进制是B,八进制是O,十进制是D,十六进制是H

下面进制转换的图转自百度经验:
https://jingyan.baidu.com/article/3065b3b6b7937fbecff8a4e0.html

1、二进制转十进制:

(1011101.101)b
在这里插入图片描述

2、十进制转二进制:

整数 除2 拿商 继续除,直至到商为0;小数部分 一直乘以2,直至到小数变为整数

在这里插入图片描述
在这里插入图片描述

3、二进制转八进制:

在这里插入图片描述

4、八进制转二进制

在这里插入图片描述

5、二进制转十六进制

在这里插入图片描述

6、十六进制转二进制:

在这里插入图片描述

7、八进制转十进制

在这里插入图片描述

8、十进制转八进制

在这里插入图片描述

9、八进制转十六进制

在这里插入图片描述

10、十六进制转八进制

在这里插入图片描述

11、十进制转十六进制

在这里插入图片描述

12、十六进制转十进制

在这里插入图片描述

二、进制运算

1、位运算概述:

简单位运算符:

符号描述运算规则
&两个位都为1时,结果才为1,否则为0
|两个位都为0时,结果才为0,否则为1
^异或两个位相同为0,相异为1
~取反0变1,1变0
<<左移各二进位全部左移若干位,高位丢弃,低位补0
>>右移各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

复合赋值位运算符:

符号描述运算规则
&=例:a&=b相当于a=a&b
|=例:a|=b相当于a=a|b
>>=例:a>>=b相当于a=a>>b
<<=例:a<<=b相当于a=a<<b
^=例:a^=b相当于a=a^b
2、&:与运算,两个位都是1,结果才为1,否则为0

如:

   10100
&  11110
———————
   10100 

扩展:
(1)清0操作

对某一段数据单元的数据清零,即将其全部的二进制位为0
a = a & 0x0
设a =15 = 0000 0000 0000 1110
a = a & 0x0 = 0000 0000 0000 1110 & 0 = 0000 0000 0000 0000

(2)获取一个数据的指定位

如获取整型数a = 321的低八位操作: a = a & 0xFF 
= 0000 0001 0100 0001 & 0xFF =0000 0000 1111 11111
= 0000 0000 0100 0001
获取a = 321 的高八位操作:a = a & 0xFF00 
= 0000 0001 0100 0001 & 0XFF00=1111 1111 0000 0000
= 0000 0001 0000 0000 

(3)判断偶数

由于奇数第一位都是1,偶数第一位都是0,于是常用:
if((n & 1) == 0)  判断偶数,代替 if (a % 2 == 0)
if((n & 1) == 1)  判断奇数,代替 if (a % 2 == 1)
3、|:或运算,两个位都是0时,结果才为0,否则为1

如:

   10100
|  11110
———————
   11110 
4、^:异或运算,两个相同为0,不同为1

如:

   10100
^  11110
———————
   01010 

扩展:
(1)判断数值是否相同

a ^ b = 0,当两个数异或运算等于0时,说明两个数相同

(2)两个数交互

设不同的两个数 a 和 b,则 a = (a^b)^b,即一个数和另一个数异或两次运算后不变,
由于这个原理常用于两个数交互运算。
一般java中交两个数交互写法:
int a = 1;
int b = 2;
int c = a;
a = b;
b = c;

而用位操作实现不用第三方变量:
int a = 1;
int b = 2;
a ^= b;
b ^= a;
a ^= b;
5、~:取反运算,是0则变1,是1则变0

如:

   10100
~  11110
———————
   01010 

扩展:
(1)变换符号

变换符号,数变成负数,负数变成正数,比如 a是正数,要变为负数,那么:
~a + 1

6、<< : 有符号左移位,将运算数的二进制整体左移指定位数,低位用0补齐。

如:

2 << 3
移动前:00010    (2)10
移动后:10000    (16)10
相当于:2 * 8

同样:

2 << 1 = 2 * 2
2 << 2 = 2 * 4

所以:

x << 1 = x * 2
x << 2 = x * 4
x << 3 = x * 8
x << 4 = x * 16
x << n = x * 2^n 

则 x 移动 n位 等于 十进制的x 乘以 2 的n次方

7、>> :有符号右移位,将运算数的二进制整体右移指定位数,整数高位用0补齐,负数高位用1补齐(保持负数符号不变)。

无符号时和<<运算符相反:

x >> 1 = x / 2
x >> 2 = x / 4
x >> n = x / 2^n
8、>>> : 无符号右移位,不管正数还是负数,高位都用0补齐(忽略符号位)
9、扩展

异或位运算简单加密:

byte[] b = {1,2,3,5,6};
byte key = 123;
//依次加密的代码 
for(int i = 0;i < b.length;i++){
b[i] = (byte)(b[i] ^ key); //利用异或加密 
}
//解密的代码 
for(int i = 0;i < b.length;i++){
b[i] = (byte)(b[i] ^ key); //利用异或解密
}

参考:
1、https://jingyan.baidu.com/article/3065b3b6b7937fbecff8a4e0.html

2、https://www.zhihu.com/question/38206659

3、https://www.jianshu.com/p/f1783080526a

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值