2010-07-12 73 views
0

这里是返回前导零的数量从黑客的喜悦书代码:为什么我的“计数前置零”程序出现故障?

#include <iostream> 
using namespace std; 

int nlz(unsigned x) { 
int n; 
if (x == 0) return(32); 
n = 1; 
if ((x >> 16) == 0) {n = n +16; x = x <<16;} 

if ((x >> 24) == 0) {n = n + 8; x = x << 8;} 
if ((x >> 28) == 0) {n = n + 4; x = x << 4;} 
if ((x >> 30) == 0) {n = n + 2; x = x << 2;} 
n = n - (x >> 31); 
return n; 
} 

int main(){ 
    int x; 
    cin>>x; 
    cout<<nlz(x)<<endl; 

    return 0; 
} 

,当我进入8号其返回8是正确的,也许它应该返回3个是吗?

8 // 1000

+0

它真的会返回8或28吗?如果8,你在使用什么样的机器? – nos 2010-07-12 21:50:53

+0

我认为你会混淆前导零(28为8的32位表示)和尾随零(3为32位表示8)。 – 2010-07-12 21:53:36

回答

2

它返回无符号整数中为零的前导比特数,它假定整数为32比特。

8是0000 0000 0000 0000 0000 0000 0000 1000二进制,并且它应该返回28,因为在前1位之前有28位前导位为零。如果你在一个整数不是32位的地方运行它,它将不起作用。

0

该算法将从32位值返回前导零个比特的数目。我不明白它是如何返回8的输入为8.