Java之Integer#highestOneBit程式碼品讀
/**
* Returns an {@code int} value with at most a single one-bit, in the
* position of the highest-order ("leftmost") one-bit in the specified
* {@code int} value. Returns zero if the specified value has no
* one-bits in its two's complement binary representation, that is, if it
* is equal to zero.
*
* @param i the value whose highest one bit is to be computed
* @return an {@code int} value with a single one-bit, in the position
* of the highest-order one-bit in the specified value, or zero if
* the specified value is itself equal to zero.
* @since 1.5
*/
public static int highestOneBit(int i) {
// HD, Figure 3-1
i |= (i >> 1);
i |= (i >> 2);
i |= (i >> 4);
i |= (i >> 8);
i |= (i >> 16);
return i - (i >>> 1);
}
1、第一步的作用是把最高位1右移移位,並與原資料按位取或。那麼這就使得最高位和它的下一位是連續兩個1。
2、第二步的作用是把剛剛移位得到連續兩個1繼續右移兩位並與原資料按位取或。那麼這就使得最高兩位和它的下兩個連續位組成四個連續的1。
3、以此類推,最終得到的i是從開始的最高位到結束全是1。並減去i(此時的i已經從最高位開始全1了)不帶符號的右移一位,即可得到一個int資料的最高位的值。
4、上述情況是針對於i不為零和負數的情況,如果i為零,那麼得到的結果始終為零。如果i位負數,那麼得到的結果始終是-2147483648。即等於Integer.MIN_VALUE。(原因在於負數的最高位始終為1,即是負數的符號位)
** 此函式的最重要理解點在與要始終把握二進位制的最高位進行運算處理,那麼對於函式中的右移一位、兩位、四位、八和十六位就好理解了。** 同理,對於long型別的取最高位運算應該需要加一條語句 i|=(i>>32); 原因在於long型別在Java中是64位的。
Long型別的hightestOneBit(i)程式碼如下:
/**
* Returns a {@code long} value with at most a single one-bit, in the
* position of the highest-order ("leftmost") one-bit in the specified
* {@code long} value. Returns zero if the specified value has no
* one-bits in its two's complement binary representation, that is, if it
* is equal to zero.
*
* @param i the value whose highest one bit is to be computed
* @return a {@code long} value with a single one-bit, in the position
* of the highest-order one-bit in the specified value, or zero if
* the specified value is itself equal to zero.
* @since 1.5
*/
public static long highestOneBit(long i) {
// HD, Figure 3-1
i |= (i >> 1);
i |= (i >> 2);
i |= (i >> 4);
i |= (i >> 8);
i |= (i >> 16);
i |= (i >> 32);
return i - (i >>> 1);
}
相關文章
- Java讀原始碼之ReentrantLock(2)Java原始碼ReentrantLock
- elasticsearch之Java呼叫原生程式碼ElasticsearchJava
- 軟光柵-uraster程式碼閱讀(入門極品)AST
- 原始碼閱讀之Java棧的實現原始碼Java
- Java學習之程式碼優化Java優化
- 產品讀書《浪潮之巔》
- 夢斷程式碼閱讀筆記之六筆記
- Python進階學習之程式碼閱讀Python
- Java併發程式設計之Executor執行緒池原理與原始碼解讀Java程式設計執行緒原始碼
- Java學習之程式碼最佳化Java
- JAVA基礎之程式碼簡潔之道Java
- Java ReEntrantLock 之 Condition條件(Java程式碼實戰-002)JavaReentrantLock
- Java併發程式設計之鎖機制之ReentrantReadWriteLock(讀寫鎖)Java程式設計
- 程式碼規範&《數學之美》讀後感
- kubernetes程式碼閱讀-apiserver之list-watch篇APIServer
- Java基礎知識整理之程式碼塊Java
- Java 執行緒池之FixedThreadPool(Java程式碼實戰-003)Java執行緒thread
- OceanBase 原始碼解讀(九):儲存層程式碼解讀之「巨集塊儲存格式」原始碼
- Java原始碼閱讀之TreeMap(紅黑樹) - JDK1.8Java原始碼JDK
- 【原創】【深入淺出系列】之程式碼可讀性
- 《碼處高效:Java開發手冊》之程式碼風格Java
- 程式設計師快樂器之JAVA程式碼生成工具程式設計師Java
- 如何閱讀Java原始碼?Java原始碼
- RNN程式碼解讀之char-RNN with TensorFlow(model.py)RNN
- 讀《程式碼大全》有感
- dreambooth程式碼閱讀boot
- ResNet程式碼精讀
- kafka程式碼解讀Kafka
- 讀完《程式碼大全》
- 【原始碼閱讀】Glide原始碼閱讀之into方法(三)原始碼IDE
- 【原始碼閱讀】Glide原始碼閱讀之with方法(一)原始碼IDE
- DeepSort之原始碼解讀原始碼
- Linklist程式碼實現以及程式碼解讀
- JNI:Java程式碼呼叫原生程式碼Java
- 【原始碼閱讀】Glide原始碼閱讀之load方法(二)原始碼IDE
- 細細品讀Retrofit的設計之美一
- java 8 HashMap 原始碼閱讀JavaHashMap原始碼
- java 程式碼塊Java