contributed by <xdennisx
>
一開始 make 的時候發現沒有 install-git-hooks
所以就把之前的複製貼上
加了發現大大增加 commit 的難度= =
所以我改了一下
calculate.c
的兩個 FILE 好像也是錯的我也改了一下
main.c
裡面的 output file 沒有初始化改成
終於給我 commit 了!!!
先把原始圖的輸出
分析:
原理:
C 從 0~3 代入,一開始 upper 跟 lower 分別會把 32 bit 拆成 16+16 個 bit,之後就看 upper 是否為 0,不是 0 的話就只要把 upper 代入下一層 recursive,下一層就會再把 upper 有效的那些 bit 再拆成一半,到 C==3
的時候終止。如果 upper 等於 0,就只要把 lower 代入下一層 recursive,算出來的答案再加上當層 upper 的 bit 數就是答案。
原理:
c 是切割的 bit 數,y 是類似 upper 的東西,如果 y 等於 1,就把要看的 bit 數縮小到 (n-c) 的範圍,再進入下一次 loop 的時候就只要看前面 y 個 bit 就好,最後再看首位是不是 0。
原理:
if 裡面的判斷式都是把目前在看的有效 bit 數砍半,例如 x <= 0x0000FFFF
就是判斷前16 bit 是不是 0,如果是都是 0,就把 n+16,接著繼續判斷後面 16 bit。如果不是 0,就把前 16 bit 的前面一半的 bit 判斷是否為 0,一直判斷到第一位 bit。
原理:
這也是一直把 32 bit 一直砍半的原理,if ((x >> 16) == 0) { n += 16; x <<= 16; }
意思就是如果前 16 bit 都是 0,那我答案就先加這 16 bit,之後就把這 16 個 0 踢掉不看,再來就看後面 16 bit 的一半,以此類推,最後 x >> 31
就是看第一位是不是 0 就是答案。
原理:
理解ing
一個類似 C++ Template 的東西,C11 以 macro 為基礎的 type-generic functions,主要透過 _Generic 關鍵字。
輸出結果:
也可以套用在 printf
上
輸出結果:
在這邊 'a'
是 int,如果要讓他已字元方式輸出需要強制 cast 他
所以我把 printf
改掉
改成
改成這樣的優點就是不會在 format 的時候打錯對應的符號,造成輸出誤差
運用 %
來簡化 Makefile
的內容,把產生執行檔的方式改寫一下
這樣以後就不用為了產生新的執行檔就要再多一條 rule
clz(x − y) >> 5
去計算 32 bit x == y
是不是對的,是 0 的話就是錯的,是 1 的話就是對的(下面網站寫錯了)