我试图在java的数字中找到尾随0的数目。我从黑客的喜悦中得到了这段代码。但无法理解。根据黑客的喜悦(第5-4节),这应该给出尾随零的数量。
numOfTrailingZeros=32-numOfLeadingZeros(~(n&(n-1))) int
我试过56,它给了我32。下面是我的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);
}发布于 2017-10-04 10:23:06
我不知道为什么你可以假设32 (字大小)-尾随0等于领先的0?
有符号整数实际上有符号位。他们使用一种名为“二的补码”的二进制编码结构。如果您要在二进制表示中查找前导或尾随零的数目,则不,无符号整数/有符号整数不重要。(编辑:如果你从来不传递负数或正数>2^word_size的一半,那就特别不相关了)。然而,56是0b00111000,当与0b00110111合并时,这个值仅为0b00110000。除第五位和第六位外,大部分产生0b1的否定(~),因此不存在前导零。)
这是因为有符号和无符号数学的基本程序集操作本质上是相同的,除了它如何影响进位。因此,当您试图分析某物的二进制结构时,它的类型在很大程度上与其数据宽度无关。
https://stackoverflow.com/questions/46562385
复制相似问题