进制与位运算

一、进制简介

进制,是指进位规则,表示逢X进一。比如,十进制逢十进一,二进制逢二进一,八进制逢八进一。

 

常见的进制:二进制、八进制、十进制、十六进制。

  • 二进制:使用【0】【1】表示每一位上的数。
  • 八进制:使用【0】【1】【2】【3】【4】【5】【6】【7】表示每一位上的数。
  • 十六进制:使用【0】【1】【2】【3】【4】【5】【6】【7】【8】【9】【A】【B】【C】【D】【E】【F】表示每一位上的数。

 

在 Java 中,数字默认是十进制,表示其他进制需要加前缀。

  • 二进制:以 0b 开头,b 大小写都可以。
  • 八进制:以 0 开头。
  • 十六进制:以 0x 开头,x 大小写都可以。

 

二、进制转换

2.1 其他进制十进制

公式:系数 * 基数的权次幂,结果相加。

  • 系数:每一位的数字;
  • 基数:几进制就是几;
  • 权:从右向左,以0开始,逐个 +1。

 

比如,二进制 100 转为十进制:

结果 = 0 * 2 ^ 0 + 0 * 2 ^ 1 + 1 * 2 ^ 2 = 4

 

2.2 十进制转其他进制

公式:除基数倒序取余,直到商为 0

 

比如,十进制 6 转为二进制:

结果 = 110

 

2.3 二进制转八进制

从右开始,3个二进制位,是八进制的1位。

 

比如,二进制 01011001 转为八进制:

结果 = 131

 

2.4 二进制转十六进制

从右开始,4个二进制位,是十六进制的1位。

 

比如,二进制 01011001 转为十六进制:

结果 = 59

 

三、原码、反码、补码

对于有符号的数而言:

  • 二进制的最高位是符号位:0表示正数,1表示负数
  • 正数和0的原码、反码、补码都一样
  • 负数的反码 = 原码符号位不变,其他位取反
  • 负数的补码 = 反码 + 1
  • 计算机是以补码的方式运算

原码与补码快速转换方式:

  • 符号位不变,从低位向高位,第一个1和之后的不变,其余位取反

 

四、位运算符

Java中的位运算符有4个:按位与(&)、按位或(|)、按位异或(^)、按位取反(~)。

异或,相当于不进位加法。

  • 任何数异或本身结果为 0;
  • 异或符合交换律:a ^ b = b ^ a;
  • 异或符合结合律:a ^ b ^ c = a ^(b ^ c)= (a ^ b)^ c;
  • 异或 0 具有保持的特点,异或 1 具有反转的特点;
  • c = a ^ b => a = b ^ c;

 

五、移位运算符

Java中的移位运算符有3个:

左移 <<:高位溢出,低位补 0。左移 n 相当于乘 2 的 n 次方。

 

右移 >>:符号位不变,低位溢出,高位补符号位数字。右移 n 相当于除 2 的 n 次方。

 

无符号右移 >>>:符号位当数字,低位溢出,高位补 0

 

【 注意】

  1. 左移符号位也会变!
  2. 一个数左移(右移)32的倍数等于本身;
  3. 一个数左移(右移)n 位,n > 0,实际移动的位数为 n % 32;n < 0,实际移动的位数为(32 + n % 32);

【有趣】-1 >>> 1,结果为最大整数。

 

六、位运算符的作用

1. 求奇偶数:

    n & 1 == 1? 奇数:偶数

2. m * 2^n = m << n;m / (2^n) = m >> n;

3. 不用临时变量交换2个值:

    a = a ^ b;

    b = a ^ b;

    a = a ^ b;

4. x % 2^n = x & (2^n - 1);

5. 将1个数转成 >= 它本身的第一个 2 的 n 次方的方法:

    n -= 1
    n |= n >>> 1
    n |= n >>> 2
    n |= n >>> 4
    n |= n >>> 8
    n |= n >>> 16
    n += 1

posted @ 2023-02-26 00:57  有点成长  阅读(218)  评论(0编辑  收藏  举报