RISC-V的確是個好東西,可是,免費的東西往往需要付出代價才能得到了,最近遇到了一個算法中的問題,追了好久,最終追到了這個庫函數中,沒想到,這個庫函數居然還隱藏着一些貓膩。值得記下來啊。
首先上一個在X86平台下的例子:
1 #include <stdio.h>
2 /* Position of the most significant bit of x */ 3 #define gap8_fl1(x) (31 - __builtin_clz((x))) 4 5 static int array[32]; 6 int main() 7 { 8 int test = 0xFFFFF00; 9 10 while(test > 0) 11 { 12 test = test>>1; 13 printf("test:%x gap8:%d \n",test,gap8_fl1(test)); 14 } 21 22 return 0; 23 } 24 ~
這個是編譯器的庫函數,表示要獲取你輸入參數的位數。
測試結果:
test:7ffff80 gap8:26 test:3ffffc0 gap8:25 test:1ffffe0 gap8:24 test:fffff0 gap8:23 test:7ffff8 gap8:22 test:3ffffc gap8:21 test:1ffffe gap8:20 test:fffff gap8:19 test:7ffff gap8:18 test:3ffff gap8:17 test:1ffff gap8:16 test:ffff gap8:15 test:7fff gap8:14 test:3fff gap8:13 test:1fff gap8:12 test:fff gap8:11 test:7ff gap8:10 test:3ff gap8:9 test:1ff gap8:8 test:ff gap8:7 test:7f gap8:6 test:3f gap8:5 test:1f gap8:4 test:f gap8:3 test:7 gap8:2 test:3 gap8:1 test:1 gap8:0 test:0 gap8:0
讓我們再看一下在RISC-V平台下的打印:
test:7ffff80 gap8:26 test:3ffffc0 gap8:25 test:1ffffe0 gap8:24 test:fffff0 gap8:23 test:7ffff8 gap8:22 test:3ffffc gap8:21 test:1ffffe gap8:20 test:fffff gap8:19 test:7ffff gap8:18 test:3ffff gap8:17 test:1ffff gap8:16 test:ffff gap8:15 test:7fff gap8:14 test:3fff gap8:13 test:1fff gap8:12 test:fff gap8:11 test:7ff gap8:10 test:3ff gap8:9 test:1ff gap8:8 test:ff gap8:7 test:7f gap8:6 test:3f gap8:5 test:1f gap8:4 test:f gap8:3 test:7 gap8:2 test:3 gap8:1 test:1 gap8:0 test:0 gap8:32
這里就有一個差別,就是當x等於0的時候,__builtin_clz((x)的值在risc-v中居然是-1,這個坑真是的不小啊。算是學習了。