Java Integer 位操作 numberOfTrailingZeros && numberOfLeadingZeros

来源:互联网 发布:国际贸易中心数据库 编辑:程序博客网 时间:2024/05/17 08:06


numberOfTrailingZeros

    public static int numberOfTrailingZeros(int i) {        // HD, Figure 5-14        int y;        if (i == 0) return 32;        int n = 31;        y = i <<16; if (y != 0) { n = n -16; i = y; }        y = i << 8; if (y != 0) { n = n - 8; i = y; }        y = i << 4; if (y != 0) { n = n - 4; i = y; }        y = i << 2; if (y != 0) { n = n - 2; i = y; }        return n - ((i << 1) >>> 31);    }

说明: n为目前结果的最大值

y!= 0  表明高n(n = 16/8/4/2)位对结果不可贡献,要减去。

y==0 , 表明贡献,所以保留

examples:



numberOfLeadingZeros

    public static int numberOfLeadingZeros(int i) {        // HD, Figure 5-6        if (i == 0)            return 32;        int n = 1;        if (i >>> 16 == 0) { n += 16; i <<= 16; }        if (i >>> 24 == 0) { n +=  8; i <<=  8; }        if (i >>> 28 == 0) { n +=  4; i <<=  4; }        if (i >>> 30 == 0) { n +=  2; i <<=  2; }        n -= i >>> 31;        return n;    }

说明: n为目前结果的最大值

i >>> n == 0  表明高n(n=16/8/4/2)位对结果有贡献,要计入结果。

i >>> n != 0 , 表明无贡献,不计入结果

n 如果初始化为0,if(i>>>31 == 0) n++; 更易理解


原创粉丝点击