为什么我的'计数领先零'程序出现故障?

时间:2010-07-12 21:48:03

标签: c++

这是从Hacker's Delight书中返回前导零数的代码:

#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

2 个答案:

答案 0 :(得分:2)

它返回无符号整数中为0的前导位数,并假设整数为32位。

8是0000 0000 0000 0000 0000 0000 0000 1000二进制,它应该返回28,因为在前1位之前有28个前导位为0。如果你在一个整数不是32位的东西上运行它,它将无法工作。

答案 1 :(得分:0)

此算法将从32位值返回前导零的数量。我没有看到它如何为8的输入返回8。