Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从无符号int(C+;+;)读取最左边位的最快方法? P>一个32位系统中,使用任何正常人使用的编译器,没有奇数的深奥边缘情况,C++的怪人似乎不能避免兴奋,最快的方法是从无符号int(bR>< /p>< p>),地球星球,大约2010,星星不对齐,正常的一天:< /P>_C++_Bit Manipulation - Fatal编程技术网

从无符号int(C+;+;)读取最左边位的最快方法? P>一个32位系统中,使用任何正常人使用的编译器,没有奇数的深奥边缘情况,C++的怪人似乎不能避免兴奋,最快的方法是从无符号int(bR>< /p>< p>),地球星球,大约2010,星星不对齐,正常的一天:< /P>

从无符号int(C+;+;)读取最左边位的最快方法? P>一个32位系统中,使用任何正常人使用的编译器,没有奇数的深奥边缘情况,C++的怪人似乎不能避免兴奋,最快的方法是从无符号int(bR>< /p>< p>),地球星球,大约2010,星星不对齐,正常的一天:< /P>,c++,bit-manipulation,C++,Bit Manipulation,任何合理的编译器都会在编译时计算出乘法和减法的大小,因此这应该成为一条右移指令,它的速度与您得到的速度差不多。这取决于int、endianness、,以及根据内存中的方向选择最左边的位还是最重要的位 猜测您想要的最高有效位是内存中ints位置的第四个字节,在一台32位的小端机上(最常见的一种) i & 0x80000000 现在,寄存器是表示MSB位存在的布尔值 可能会向右移位,这可能会生成较少的目标代码: i >> (sizeof(i) * CHAR_BIT - 1)

任何合理的编译器都会在编译时计算出乘法和减法的
大小,因此这应该成为一条右移指令,它的速度与您得到的速度差不多。

这取决于int、endianness、,以及根据内存中的方向选择最左边的位还是最重要的位

猜测您想要的最高有效位是内存中
int
s位置的第四个字节,在一台32位的小端机上(最常见的一种)

i & 0x80000000
现在,寄存器是表示MSB位存在的布尔值

可能会向右移位,这可能会生成较少的目标代码:

i >> (sizeof(i) * CHAR_BIT - 1)
更新0 也许有些人不知道我上面的意思。在我给出的示例体系结构中,您也可以这样做:

((unsigned char *)&i)[3] >> 7
((unsigned char *)&i)[3] & 0x80

在运行时可能比换档快,如果且比换档快:

i & (1 << (sizeof(unsigned int) * CHAR_BIT - 1))
i&(1)
例如,假设8位int,将其分解

0U = 00000000b
~0U = 11111111b
~0U >> 1 = 01111111b
~(~0U >> 1) = 10000000b
然后将此值与要测试的值(强制转换为无符号int)


当然,您也可以尝试以下方法:

((int) myUint) < 0 // true if set, otherwise false
((int)myUint)<0//如果设置为true,否则为false
事实上,对于有符号整数,最左边的位是负数

这也应该非常快,因为强制转换是编译时的事情,实际上不需要执行-它只是告诉编译器使用有符号的操作码而不是无符号的操作码。所以我相信需要执行一条指令(
CMP
?)。

这怎么样

i >> numeric_limits<unsigned>::digits - 1;
i>>数字限制::数字-1;

假定int:-)的大小。@code-gijoe:-1与
0x8000000
不同。事实上,(value and -1)只是<代码>值<代码>。我不认为数百万的嵌入式设备是“边缘情况”。不过,我认为你的答案不值得一投票。我怀疑永远都不会有时间(只要C++和C被广泛使用)。所有通用系统都同意
int
的大小。此外,虽然我同意Tyler McHenry的答案在适用于任何平台方面都是最全面的,但我认为它的可读性远不如这个(或16位或8位等效)。在具有不同大小的
int
的目标之间实际移植了多少代码,这与这样的测试有多大关系,这种测试很可能是针对一些规范长度的数据执行的,即16位或32位,而不管它移植到什么平台?你们中有人会在代码中使用泰勒的结构吗?“物理内存中左起25位”???我猜那是一个开玩笑的玩笑。此外,字节顺序和位顺序在这里都不重要。OP(不精确)在应用于int时使用“最左边的位”一词与该int的内存存储无关。一点也不。MSB位存储在小型endian机器的第4个字节中。因此,MSB要么是第25位,要么是第32位,这取决于位与字节的排列方式(但这并不重要,因为单个字节是原子的)。“因为单个字节是原子的”。。。我还希望第25位也是开玩笑的。如果这些位在物理上排列成一个圆圈呢?是我的左边,还是电脑的左边?(毕竟,我的电脑面对着我!)是的,非常有趣。。。也许我的解释太过火了,但事实仍然是OP使用了“最左边的位”,而不是“最重要的位”。你想要什么结果?如果是1,您希望1作为答案,还是任何非零结果都足够?负值的
>
行为是实现定义的,而
~0
是负值。将
0
更改为
0U
就可以了,因为没有负的无符号数。+1但是。。。这比其他所有解决方案都快,或者说同样快,但它确实假设您所使用的CPU使用最左边的位作为符号位。这可能是一个安全的假设。请注意,这需要一个大常量,它需要嵌入到代码或常量数据中。在许多ISA上,固定长度上的移位可以用一条指令编码。因此,即使AND指令本身可能更快,内存/缓存开销也可能使其变得更慢;唯一的方法(如果你真的在乎的话!)是在你的目标平台上对这两种方法进行基准测试。但我怀疑这在实际节目中是否重要。选择您认为最清晰的方法。假设
数值限制::基数==2
。这可能在任何地方都是正确的。它可能不是2吗?如果是,其他答案中没有一个是正确的。无论如何,基数!=2是如此不自然,所以假设所有C++实现都使用基数=2是安全的。对吗?
CHAR\u位
limits.h
中定义。
0U = 00000000b
~0U = 11111111b
~0U >> 1 = 01111111b
~(~0U >> 1) = 10000000b
(unsigned int ) a & MSB;
((int) myUint) < 0 // true if set, otherwise false
i >> numeric_limits<unsigned>::digits - 1;