Objective c 获取最左边的位

Objective c 获取最左边的位,objective-c,binary,bit-manipulation,Objective C,Binary,Bit Manipulation,我用的是一个5位整数。Objective-C中是否有一个本机函数可以让我知道哪个位是最左边的 i、 e.我有01001,它将返回8或该位置 感谢您,您可以构建一个包含32个元素的查找表:0、1、2、2、3等。这实际上与计算前导0的数量相同。有些CPU对此有说明,否则可以使用中的技巧 这也相当于四舍五入到最接近的2次方,同样,你可以在中找到有效的方法,例如 另请参见:有许多示例说明如何实现这一点。如果您指的是从右边第五位(五位值中的“最左边”)的任何位的值,则: 如果您的意思是最左边的位的位置为1

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

i、 e.我有01001,它将返回8或该位置


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

这实际上与计算前导0的数量相同。有些CPU对此有说明,否则可以使用中的技巧

这也相当于四舍五入到最接近的2次方,同样,你可以在中找到有效的方法,例如


另请参见:

有许多示例说明如何实现这一点。

如果您指的是从右边第五位(五位值中的“最左边”)的任何位的值,则:

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

    int value = 2;
    int position;
    for (position = 0; position < 5; position++) {
            int bit = (value >> position) & 1;
            if (bit == 1)
                    break;
    }
    // position is 1
int值=2;
内部位置;
用于(位置=0;位置<5;位置++){
int位=(值>>位置)&1;
如果(位==1)
打破
}
//位置是1
对于最右边的位,位置为0;对于五位值中最左边的位,位置为4;如果所有位均为零,位置为5

注意:以时钟周期为单位,这不是最有效的解决方案。希望这是一个相当清晰和有教育意义的问题。:)

NSInteger值=9;
NSInteger移位=1;
用于(NSInteger位=值;位>1;位=值>>++shift);

NSInteger leftmostbit=1我不知道目标C,但这就是我在C中的实现方式

功率(2,整数)(对数2(数字))

这将为您提供最左边的1位值


在使用此解决方案之前,请参阅下面的STEPHEN CANON评论。

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

while ( x & (x-1) ) x &= x - 1;
// 01001 => 01000
x &= -x;
// 01001 => 00001
要清除最低有效位以上的所有位,请执行以下操作:

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位整数中的前导零。这是最接近本机Objective-C函数的函数。要获取整数中最高有效位的位置,请执行以下操作:

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

如果您不想使用表查找,我会使用
31-\u builtin\u clz(yourNumber)

\uuuu builtin\u clz()
是gcc、llvm-gcc和clang(可能还有其他编译器)所支持的编译器内部版本。它返回整数参数中前导零位的数量。从
31
中减去该数字将给出最高阶集合位的位置。它应该可以在任何目标体系结构上生成相当快的代码。

使用VC++查看
_BitScanReverse/(64)在

中,您是指最左边的位是1吗?从您的示例来看,它看起来是这样的,但是……对于这种特殊情况,32元素的查找表绝对是最好的解决方案。@Stephen:只有当您100%确定位的数量始终是5(或者至少是一个相对较小的数字)时才可以,并且您永远不想进行任何优化,例如SIMD或GPGPU。@Paul R:实际上,32字节的查找表非常适合在大多数向量体系结构上实现SIMD(在AltiVec或NEON上,这是一条单指令;SSE需要多做一点工作,但仍然不算太差).GPGPU可能是另一个故事,正如您所注意到的。@Stephen:没错,这在AltiVec和vec_perm上运行得很好,但如果您需要超过32个元素的LUT,它会变得很糟糕。在SSE上要困难得多,除非您可以假设SSSE3(因此PSHUFB)。不要为此使用
pow
。没有语言保证
pow
将提供精确的二次幂(发生在OS X上,这可能是目标,因为问题被标记为
objective-c
,但这不是可移植的假设)。在许多平台上,它的效率也非常低。你想要
leftmostbit=1谢谢,你是对的。我根据你的评论更新了代码。这在许多平台上速度非常慢,在其他平台上会给你错误的答案(无法保证
log2
pow
函数是正确的四舍五入函数(即使对于小整数也是如此),而且在许多平台上它们不是正确的)@Stephen Canon-我只是想展示另一种解决这个问题的方法。在缓慢的问题上,你可能是对的,但整型铸造的整个想法是去掉分数部分,一旦你做到了,pow()将始终返回整数。我不知道log2和pow有舍入问题。如果是这种情况,那么结果可能会出错。无法保证
pow(2,someInteger)
将始终返回整数。事实上,我不幸使用了几个平台,但它没有(不幸,但正确).
x |=x>>1也可以。很好的解决方案!
position = 31 - clz( x );
// 01001 => 3