# 2016q3 Homework1 (clz)
## 開發環境
* OS:Lubuntu 16.04 LTS
* Memory: 8 GB
* CPU:
* Name:
* Intel(R) Core(TM) i5-4200H CPU @ 2.80GHz
* Cache:
* L1d Cache: 32K
* L1i Cache: 32K
* L2 Cache: 256K
* L3 Cache: 3072K
## clz簡介
目標:在由一連串有序的bit組成的排列中,找尋出現第一個1前含有的0之總數。
## 建立test case
為了先驗證以下幾種clz的演算法正確運作,因此先建立一個可測試所有32bit的程式。
思考過程:
我們必須先針對每個數字做測試,所以會有個基本的迴圈,從0x00000000到0xFFFFFFFF,但是要考量邊界避免溢值所以把迴圈設計成0x00000000到0xFFFFFFFE,0xFFFFFFFF另外判斷
```clike=
for(uint32_t i=0; i<UINT_MAX; i++){
}
/* test UINT_MAX */
```
而要如何知道每個i的clz是多少呢?,我想到[重新理解數值](https://hackmd.io/s/SkKZBXZT)的`x & (x - 1) == 0`,當clz值改變時,正好是二的次方,在將程式碼改成以下
```clike=
for(uint32_t i=0,j=33; i<UINT_MAX; i++){
if( i & (i-1) == 0){
j--;
printf("i:%u,j:%u\n",i,j);
}
/* test func(i)==j; if neq, break*/
}
if(i==UNIT_MAX){
/* test func(UINT_MAX) == 0 */
}
else{
/* error message*/
}
```
註:i=0時 i&(i-1)= 0x00000000 & 0xFFFFFFF(溢位) =0 所以j從33開始。
之後我們就可以像compute-pi的benchmark模式做測試了。
## 分析各個clz演算法
待續,來不及做QQ
### recursive version
### iteration version
### binary search technique
### byte-shift version
### Harley’s algorithm
## 參考資料