一、基础
1、类型基础
计算中最小的内存单位是bit,只可以表示0,1
类型 | 大小 |
---|---|
1Byte | 8bit |
1int | 4byte 32bit |
1 long | 8byte 64bit |
1 float | 4byte 32bit |
1 char | 2byte 16bit |
2、存储基础
int a = 1,这个1在计算中是怎么存储的?
0000 0000 0000 0000 0000 0000 0000 0001
3、运算符基础:
(1)左移 <<
8 << 2 => 8* 2^2=32 ;向左移动多少位,就是乘以2的n次方
8: 0000 0000 0000 0000 0000 0000 0000 1000
==> 0000 0000 0000 0000 0000 0000 0010 0000 => 2^5= 22222=32
(2)右移 >>
8 >> 2 => 8 / 2^2 = 2 ; 向右移动多少位,就是除以2的n次方
8: 0000 0000 0000 0000 0000 0000 0000 1000
==> 0000 0000 0000 0000 0000 0000 0000 0010 => 2^1=2
(3) & 、|
位与 &:同位上的两个数都是1则位1,否则为0(一假则假)
位或 |:同为上的两个数只要有一个为1 则为1,否则为0(一真则真)
(4)除法转与运算&
将除法转换为按位与运算(&)的操作主要适用于特定的情况,尤其是当我们希望得到一个数除以 (2^n) 的结果时。这种转换通常用于快速地获取一个数除以 (2^n) 的商或者求余数。
基本原理
- 除以 (2^n) 的商:
对于任何整数 x 和正整数 n,x 除以 (2^n) 的商,可以通过将 x 右移 n 位来获得,即 x >> n。
例如,x / 8 可以通过 x >> 3 来计算。 - 求 (2^n) 的余数:
对于任何整数 x 和正整数 n,x 除以 (2^n) 的余数,可以通过 x 与 (2^n - 1)进行按位与运算来获得,
即x & (2^n - 1)。
例如,x % 8 可以通过 x & 7 来计算。
示例
假设我们有一个整数 x,我们想计算 x 除以 8 的商和余数。
- 计算商:
x / 8 可以通过 x >> 3 来计算。
这是因为右移 3 位相当于除以 (2^3),即除以 8。 - 计算余数:
x % 8 可以通过 x & 7 来计算。
这是因为 7 的二进制表示为 0111,与任何小于 8 的数进行按位与运算,都会返回该数本身。
4/8 余数是4;转成 4&7 => 0100 & 0111 = 0100(一假则假,只要有0,则结果是0) ,也就是4
代码
下面是一个简单的 Java 示例,演示了如何使用按位与运算来计算除法和求余数: