获得最左边的位置

时间:2010-05-23 21:28:06

标签: objective-c binary bit-manipulation

我正在使用5位整数。 Objective-C中是否有一个本机函数可以让我知道最左边的哪个位?

即。我有01001,它将返回8或位置。

由于

9 个答案:

答案 0 :(得分:7)

您可以构建一个包含32个元素的查找表:0,1,2,2,3等。

答案 1 :(得分:6)

这实际上与计算前导0的数量相同。有些CPU有一个指令,否则你可以使用Hacker's Delight中的技巧。

它也相当于向下舍入到最接近2的幂,再次在Hacker's Delight中找到有效的方法,例如

uint8_t flp2(uint8_t x)
{
    x = x | (x >> 1);
    x = x | (x >> 2);
    x = x | (x >> 4);
    return x - (x >> 1);
}

另请参阅:Previous power of 2

答案 2 :(得分:4)

NSInteger value = 9;
NSInteger shift = 1;
for(NSInteger bit = value; bit > 1; bit = value >> ++shift);
NSInteger leftmostbit = 1 << shift;

适用于每个位数。

答案 3 :(得分:2)

如果您不想使用表格查找,我会使用31 - __builtin_clz(yourNumber)

__builtin_clz( )是gcc,llvm-gcc和clang(以及可能还有其他编译器)支持的编译器内在函数。它返回整数参数中前导零位的数量。从31中减去该值可以得到最高位设置位的位置。它应该在任何目标架构上生成相当快的代码。

答案 4 :(得分:0)

Stanford Bit Twiddling Hacks有很多关于如何实现这一目标的例子。

答案 5 :(得分:0)

如果你的意思是任何位的值在右边的位置5(五位值的“最左边”),那么:

    int value = 17;
    int bit = (value >> 4) & 1; // bit is 1

如果你的意思是最左边的位的位置是1:

    int value = 2;
    int position;
    for (position = 0; position < 5; position++) {
            int bit = (value >> position) & 1;
            if (bit == 1)
                    break;
    }
    // position is 1

对于最右边的位,位置为0,对于五位值的最左位,位置为4;如果所有位都为零,则位置为5.

注意:在时钟周期中,这不是最有效的解决方案。希望它是一个相当清晰和有教育意义的人。 :)

答案 6 :(得分:0)

我不知道目标C,但这就是我在C中的表现。

pow(2,int(log2(Number))

这应该给你最左边的1位值。

请在使用此解决方案之前查看STEPHEN CANON的评论。

答案 7 :(得分:0)

清除最高位以下的所有位:

while ( x & (x-1) ) x &= x - 1;
// 01001 => 01000

清除最低有效位之上的所有位:

x &= -x;
// 01001 => 00001

获取字节中唯一设置位的位置:

position = ((0x56374210>>(((((x)&-(x))*0x17)>>3)&0x1C))&0x07);
// 01000 => 3

在libkern.h中,定义了一个clz函数来计算32位int中的前导零。这是与本机Objective-C函数最接近的东西。获取int中最重要位的位置:

position = 31 - clz( x );
// 01001 => 3

答案 8 :(得分:0)

用VC ++看看