出自開源庫klib(一個c語言的標準庫)中。github地址。git
對於32位的機器的二進制數字進行向上的四捨五入github
例如 7(111)->8(1000), 12(1100)->(10000)函數
#include <stdio.h> #include <stdint.h> #ifndef kroundup32 #define kroundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x)) #endif int main(int argc, char const *argv[]) { int x=7; kroundup32(a); printf("%d\n",x); // 顯示8(1000) return 0; }
00000000000000000101001011011011
數字減一,避免進一步的四捨五入。 例如 100不向1000進行四捨五入的進位,10000不向100000進行四捨五入的進位。
1. 右移1位 -> 保障前2個位置都變成1 00000000000000000101001011011010 | 0000000000000000010100101101100 --------------------------------- 00000000000000000111001011011010
2. 由於爲上一次的"|"運算,使得前2位都是"1" 因此此次右移2位 -> 保障前4個位置都變成1 00000000000000000111001011011010 | 000000000000000001110010110110 --------------------------------- 00000000000000000111111011111111
3. 同上 由於爲上一次的"|"運算,使得前4位都是"1" 因此此次右移4位 -> 保障前8個位置都變成1 00000000000000000111111011111111 | 0000000000000000011111101111 --------------------------------- 00000000000000000111111111111111
4. 同上 由於爲上一次的"|"運算,使得前8位都是"1" 右移8位 -> 保障前16個位置都變成1 00000000000000000111111111111111 | 000000000000000001111111 --------------------------------- 00000000000000000111111111111111
5. 同上 由於爲上一次的"|"運算,使得前16位都是"1" 右移16位 -> 保障前32個位置都變成1 00000000000000000111111111111111 | 0000000000000000 --------------------------------- 00000000000000000111111111111111
覺得上一步中將這個數字的全部爲止都變成了1,因此"+1"後就完成了進位的工做code