如何使用整数索引获取 64 位 unsigned long 的 16 位部分?

Ara*_*aki 0 c indexing pointers bit-manipulation

我正在尝试从 64 位 unsigned long 返回某些 16 位部分,但我一直在思考如何实现这一点。这是我试图实现的功能:

// assume i is a valid index (0-3 inclusive)
unsigned short get(unsigned long* ex, int i) {
  // return the 16-bit section based on the index i
}
Run Code Online (Sandbox Code Playgroud)

例如,如果我有unsigned long ex = 0xFEDCBA9876543210;,那么我的函数get(ex, 0)将返回0x3210get(ex, 1)将返回0x7654,等等。我对 C 非常陌生,我仍在尝试围绕位管理和指针。感谢任何建议或反馈,以帮助我更好地理解 C。

Ema*_*l P 5

你必须使用位移

#include <stdint.h>
uint16_t get(uint64_t ex, int i)
{
    return (uint16_t)(ex >> i*16);
}
Run Code Online (Sandbox Code Playgroud)

您可以仅按值传递。没有理由传递指针。这会将位向右移动,这意味着它们将成为低位值。当它转换为 16 位类型时,它会丢失高阶位。

我包括在内stdint.h是因为它定义了精确大小的类型。

  • 对返回类型进行显式转换可能会更好:“return (uint16_t)(ex &gt;&gt; i*16);”。我还将“(i * 16)”术语放在括号中,以使其更清晰(尽管“*”的优先级高于“&gt;&gt;”)。 (3认同)