无符号整数在此代码中是否起着至关重要的作用?

时间:2017-10-04 10:16:21

标签: java bit-manipulation bitwise-operators

我试图在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);
}

1 个答案:

答案 0 :(得分:0)

我不确定为什么你可以假设32(字长) - 尾随0' s等于领先0?

有符号整数有一个符号位。他们使用称为"二进制补码"的二进制编码结构。如果您正在寻找其二进制表示中前导或尾随零的数量,那么不,无符号整数/有符号整数并不重要。 (编辑:如果你从未传递一个负数或正数> 2 ^ ^ word_size的一半,它尤其无关紧要)。但是,56是0b00111000,其与0b00110111一起仅为0b00110000。否定(〜)除了第五和第六位之外主要产生0b1,因此不存在前导零。)

这是因为有符号和无符号数学的基本汇编操作基本相同,除了它如何影响进位。因此,当您尝试分析某事物的二进制结构时,除了数据宽度之外,它的类型变得无关紧要。