2017-10-04 25 views
0

我正试图在java中查找一个数字的尾数零。 我从黑客的喜悦中得到了这段代码。但无法理解它。 根据黑客的喜悦(第5-4节),这应该给出尾随零的数量。无符号整数在此代码中扮演着至关重要的角色吗?

INT numOfTrailingZeros = 32 numOfLeadingZeros(〜(N &(N-1)))

我试过它给了我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); 
} 
+4

FYI Java有'Integer.numberOfTrailingZeros' – harold

+0

你的代码产生的尾数零而不是前导零的数量。你的功能是否错误? – noel

回答

0

我不确定为什么你可以假设32(字大小) - 尾随0是等于前导0?

有符号整数具有符号位。他们使用称为“二补”的二进制编码结构。如果你正在寻找它的二进制表示中的前导或尾随零的数量,那么无,无符号整数/有符号整数无关紧要。 (编辑:如果你永远不会传递一个负数或正数> 2^word_size的一半),那么这是非常不相关的。然而,56是0b00111000,当&'用0b00110111编辑时只是0b00110000。除了第五和第六位以外,大多数0b1产生的负数(〜),因此不会有前导零。)

这是因为对于有符号和无符号数学的基本汇编操作基本上是相同的影响进位。因此,当你试图分析某些东西的二进制结构时,它的类型除了数据宽度之外几乎是不相关的。

+0

我的想法是,如果数字有符号比32位数字,它将只有31位用于实际数字表示,而1位用于符号表示。这是对的吗? –

+0

不,大多数数字系统使用“二补”。虽然看起来像是一种过度复杂的做事方式,但它简化了晶体管级别的硬件。当然,你可以谷歌它,但基本上,这意味着MSB(位32)不只是一个符号位 - 它是负的(2^32)。如果我们在说8位,-1 = 0b1111111 –

相关问题