Skip to content

Commit 0899a14

Browse files
committed
[Update] Interger 增加部分位运算解析
1 parent 92081d9 commit 0899a14

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed

java/source-code/jdk/lang/integer.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
- [测试样例](#%E6%B5%8B%E8%AF%95%E6%A0%B7%E4%BE%8B)
1111
- [`toString()`](#tostring)
1212
- [测试样例](#%E6%B5%8B%E8%AF%95%E6%A0%B7%E4%BE%8B-1)
13+
- [`highestOneBit()`](#highestonebit)
14+
- [`lowestOneBit()`](#lowestonebit)
15+
- [`rotateLeft()`](#rotateleft)
1316
- [参考](#%E5%8F%82%E8%80%83)
1417

1518
---
@@ -205,6 +208,52 @@ private static void getChars(int i, int index, char[] buf) {
205208
|JDK|0-1|1.625|8.5|40.375|88.875|644.875|4210.75|
206209
|自己的实现|0-1|1.875|8.125|26.5|113|631.5|4777.875|
207210

211+
## `highestOneBit()`
212+
213+
```java
214+
public static int highestOneBit(int i) {
215+
// HD, Figure 3-1
216+
// 最高位右侧全部置为1
217+
i |= (i >> 1);
218+
i |= (i >> 2);
219+
i |= (i >> 4);
220+
i |= (i >> 8);
221+
i |= (i >> 16);
222+
// 去掉最高位右侧所有1
223+
return i - (i >>> 1);
224+
}
225+
```
226+
227+
## `lowestOneBit()`
228+
229+
获取最低位。利用的是补码的性质。
230+
231+
最低位的1 右侧必然全部为0,取负数以后最低位的1置为0,右侧0全部置为1,然后加一,所有1都会进位,然后原来最低位的1 又从0变为1了,取 & 操作,可以去掉前面的所有 1,从而得到最低位的1.
232+
举个例子
233+
234+
2
235+
2 的二进制是 10
236+
-2 的二进制是 1111110 (高位补1)
237+
238+
2 & -2 = 2
239+
240+
```java
241+
public static int lowestOneBit(int i) {
242+
// HD, Section 2-1
243+
return i & -i;
244+
}
245+
```
246+
247+
## `rotateLeft()`
248+
249+
```java
250+
public static int rotateLeft(int i, int distance) {
251+
// i << distance 得到新值的高 32-dis 位
252+
// i >>> -distance == i >>> (32 - distance),得到新增低 distance 位
253+
return (i << distance) | (i >>> -distance);
254+
}
255+
```
256+
208257
## 参考
209258

210259
1. [[FYI] 关于Integer的自动缓存大小 - RednaxelaFX](https://rednaxelafx.iteye.com/blog/680746)

0 commit comments

Comments
 (0)