klib庫下的kroundup32(二進制的四捨五入)算法

出自開源庫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;
}

二. 解釋說明

1. 舉例 00000000000000000101001011011011

2. 步驟1 --x

數字減一,避免進一步的四捨五入。

例如 100不向1000進行四捨五入的進位,10000不向100000進行四捨五入的進位。

3. 步驟2 經過右移和"|"運算, 分別把一"補"入到每個位置,直到每個位置都是"1"爲止

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

4. 步驟3 ++x

覺得上一步中將這個數字的全部爲止都變成了1,因此"+1"後就完成了進位的工做code

相關文章
相關標籤/搜索