如果我有一个整数n,并且我想知道最高位的位置(也就是说,如果最低有效位在右边,我想知道最左边位的位置是1),找出最快捷/最有效的方法是什么?
我知道POSIX支持ffs()strings.h中的一个方法来查找第一个设置位,但似乎没有相应的fls()方法.
是否有一些非常明显的方法可以解决这个问题?
如果你不能使用POSIX功能来实现可移植性呢?
编辑:如何在32位和64位架构上运行的解决方案(许多代码清单似乎只能在32位整数上运行).
我想在标准 C++ 中将任何大小整数的前导零位设置为 1。
例如。
0001 0011 0101 1111 -> 1111 0011 0101 1111
我发现执行此操作的所有算法都需要相当昂贵的前导零计数。然而,这很奇怪。有非常快速且简单的方法来执行其他类型的位操作,例如:
int y = -x & x; //Extracts lowest set bit, 1110 0101 -> 0000 0001
int y = (x + 1) & x; //Will clear the trailing ones, 1110 0101 - > 1110 0100
int y = (x - 1) | x; //Will set the trailing zeros, 0110 0100 - > 0110 0111
Run Code Online (Sandbox Code Playgroud)
因此,这让我认为必须有一种方法可以在由基本位运算符组成的一行简单代码中设置整数的前导零。请告诉我还有希望,因为现在我正在准备反转整数中的位顺序,然后使用设置尾随零的快速方法,然后再次反转整数以将前导零设置为 1。这实际上比使用前导零计数要快得多,但与上面的其他算法相比仍然相当慢。
template<typename T>
inline constexpr void reverse(T& x)
{
T rev …Run Code Online (Sandbox Code Playgroud) 可能重复:
找到C中的最高位
我怎么能写一个C函数,将产生一个面具表示最左边的1在x.
例如:0xFF00 -> 0x8000和0x6600 -> 0x4000.至今:
int left1(unsigned x){}
Run Code Online (Sandbox Code Playgroud)
我明白了,0xFF00 == 1111 1111 0000 0000..
和0x6600 == 0110 0110 0000 0000..但我以后难住了.
unsigned GetLowestBitPos(unsigned value)
{
double d = value ^ (value - !!value);
return (((int*)&d)[1]>>20)-1023; // This is what I really need help understanding.
}
Run Code Online (Sandbox Code Playgroud)
在我看来,代码将一个double转换为指向整数的指针.我不确定[1]的用途是什么.然后看起来我们向右移位了20位
我将不胜感激任何有关此代码的帮助.我已经用C++编程了一段时间,并且我正在尝试为可编程逻辑控制器(PLC)编写逻辑,以便在可能的情况下执行相同的操作.
谢谢你的帮助
如何在给定的无符号整数x找到最小的n,即2 ^ n≥ x在O(1)?换句话说,我想在O(1)中找到二进制格式x(加上1,如果x不是2的幂)的更高设置位的索引(不依赖于整数的大小和字节的大小).