# 2016q3 Homework1 (clz)
contribute by <`kaizsv`>
### recursive
```clike=
int recursive(uint32_t N, int length)
{
int shift = length >> 1;
int left = 32 - shift;
uint32_t MAX = 0xFFFFFFFF;
uint16_t upper = (N >> shift) & (MAX >> left);
uint16_t lower = (N & (MAX >> left));
if (shift == 1) {
return upper ? 0 : (lower ? 1 : 2);
}
return upper ? recursive(upper, shift) : shift + recursive(lower, shift);
}
```
### harley algorithm
這個一直試不好,後來看了[這篇](http://www.hackersdelight.org/hdcodetxt/nlz.c.txt)把`table`的順序調一下,我在程式碼內都有插入`assert`確保這些修改的程式碼是對的。
```clike=
int harley_algorithm(uint32_t N)
{
static int const table[] = {
32, 31, 0xff, 16, 0xff, 30, 3, 0xff,
15, 0xff, 0xff, 0xff, 29, 10, 2, 0xff,
0xff, 0xff, 12, 14, 21, 0xff, 19, 0xff,
0xff, 28, 0xff, 25, 0xff, 9, 1, 0xff,
17, 0xff, 4, 0xff, 0xff, 0xff, 11, 0xff,
13, 22, 20, 0xff, 26, 0xff, 0xff, 18,
5, 0xff, 0xff, 23, 0xff, 27, 0xff, 6,
0xff, 24, 7, 0xff, 8, 0xff, 0, 0xff
};
N = N | (N >> 1);
N = N | (N >> 2);
N = N | (N >> 4);
N = N | (N >> 8);
N = N | (N >> 16);
N = (N << 3) - N;
N = (N << 8) - N;
N = (N << 8) - N;
N = (N << 8) - N;
return table[N >> 26];
}
```
![](https://i.imgur.com/WAv9gPt.png)
![](https://i.imgur.com/TT7xrQT.png)
直接下`make plot`就會產生這兩張,上面是`i = 0 ~ 1,000,000`每個點的時間,若是 32bit 太花時間,就算加上`OpenMP`還是要很久,且檔案很大根本塞不進記憶體,就先算到1,000,000。
下面是1,000,000次的平均值,就我的結果而言,`binary search and bit shift`的
###### tags: `assigment_4` `clz`