我试图在java中找到一个数字的尾随零。 我从黑客的喜悦中得到了这段代码。但无法理解。 根据黑客的喜悦(第5-4节),这应该给出尾随零的数量。
int numOfTrailingZeros = 32-numOfLeadingZeros(〜(n&(n-1)))
我试过 56 它给了我32。 这是我在hacker的喜悦中的numOfLeading 0实现方法numOfLeadingZeros的参数是无符号整数。它是否在该方法中发挥了重要作用,任何人都可以解释我它是如何工作的?
public static int numOfLeadingZeros(int x){
int n;
if(x==0) return (32);
n=1;
if((x & 0x0000FFFF) == 0) { n=n+16; x=x>>16;}
if((x & 0x000000FF) == 0) { n=n+8; x=x>>8;}
if((x & 0x0000000F) == 0) { n=n+4; x=x>>4;}
if((x & 0x00000003) == 0) { n=n+2; x=x>>2;}
return n - (x & 1);
}
答案 0 :(得分:0)
我不确定为什么你可以假设32(字长) - 尾随0' s等于领先0?
有符号整数有一个符号位。他们使用称为"二进制补码"的二进制编码结构。如果您正在寻找其二进制表示中前导或尾随零的数量,那么不,无符号整数/有符号整数并不重要。 (编辑:如果你从未传递一个负数或正数> 2 ^ ^ word_size的一半,它尤其无关紧要)。但是,56是0b00111000,其与0b00110111一起仅为0b00110000。否定(〜)除了第五和第六位之外主要产生0b1,因此不存在前导零。)
这是因为有符号和无符号数学的基本汇编操作基本相同,除了它如何影响进位。因此,当您尝试分析某事物的二进制结构时,除了数据宽度之外,它的类型变得无关紧要。