这是从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
答案 0 :(得分:2)
它返回无符号整数中为0的前导位数,并假设整数为32位。
8是0000 0000 0000 0000 0000 0000 0000 1000二进制,它应该返回28,因为在前1位之前有28个前导位为0。如果你在一个整数不是32位的东西上运行它,它将无法工作。
答案 1 :(得分:0)
此算法将从32位值返回前导零位的数量。我没有看到它如何为8的输入返回8。