位操作和> 32 位数字?

Bit manipulation and > 32 bit numbers?

本文关键字:数字 gt 位操作      更新时间:2023-10-16

我基本上正在尝试以下操作:

c[i] = ((number_to_store << pos) & 0xFF00000000) >> 32;

但是这将0存储在c[i]中——这是意料不到的。以下作品很有魅力:

c[i] = ((number_to_store << pos) & 0xFF000000) >> 24;

我99%确信这个错误与我所有的变量都是unsigned int有关,但这里我请求的是40位空间。

当涉及比特操作时,有人能解释小于或等于32比特的和大于32比特的数字之间的差异吗?

编辑:这也给了我0:

cout << ((((unsigned long)number_to_store << (unsigned long)pos) & (unsigned long)0xFF00000000) >> 32) << endl;

编辑2:以下作品:

cout << ((((unsigned long long)number_to_store << (unsigned long long)pos) & (unsigned long long)0xFF00000000) >> 32) << endl;

经验教训:永远不要期望long大于int

无符号int是32位,如果将其移位32位,它将变为0。正如您所发现的,为了保留在第一次移位中向左移位的位,您必须将number_to_store声明为unsigned long long,即64位。