我正在使用5位整数。 Objective-C中是否有一个本机函数可以让我知道最左边的哪个位?
即。我有01001,它将返回8或位置。
由于
答案 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 ++看看