位移 0 的目的是什么
What is the purpose of bitshifting by 0
我正在查看 Linux 的开源 AMD GPU 驱动程序。我注意到一些我以前没有见过的东西,我想知道目的。在sid.h文件的第1441行,有一系列定义是整数被左移0位。这不就是对原始整数进行运算吗?
这里是摘录和link到头
#define VGT_EVENT_INITIATOR 0xA2A4
#define SAMPLE_STREAMOUTSTATS1 (1 << 0)
#define SAMPLE_STREAMOUTSTATS2 (2 << 0)
#define SAMPLE_STREAMOUTSTATS3 (3 << 0)
https://github.com/torvalds/linux/blob/master/drivers/gpu/drm/amd/amdgpu/sid.h#L1441
此外,我正在学习访问 AMD GPU 的性能计数器寄存器以计算 GPU 负载。对此的任何提示也将不胜感激。
为了保持一致性可以这样做(不一定适用于您的具体情况)。例如,我可以将一组单位标志描述为
#define FLAG_1 0x01
#define FLAG_2 0x02
#define FLAG_3 0x04
#define FLAG_4 0x08
或
#define FLAG_1 (1u << 0)
#define FLAG_2 (1u << 1)
#define FLAG_3 (1u << 2)
#define FLAG_4 (1u << 3)
在后一种方法的第一行中,我不必移动 0
。但这样看起来更一致,并强调了 FLAG_1
与其他标志具有相同性质的事实。 0
充当不同值的占位符,如果有一天我决定更改它。
您实际上可以在 DYN_OR_EN
和 DYN_RR_EN
宏的定义中通过 0
移位的链接代码中准确地看到这一点。
该方法可以扩展到单词中的多位字段,如以下(人为的)示例
// Bits 0-3 - lower counter, bits 4-7 - upper counter
#define LOWER_0 (0u << 0)
#define LOWER_1 (1u << 0)
#define LOWER_2 (2u << 0)
#define LOWER_3 (3u << 0)
#define UPPER_0 (0u << 4)
#define UPPER_1 (1u << 4)
#define UPPER_2 (2u << 4)
#define UPPER_3 (3u << 4)
unsigned packed_counters = LOWER_2 + UPPER_3; /* or `LOWER_2 | UPPER_3` */
同样,移位 0
位纯粹是为了视觉上的一致性。以及 0
值的变化。
您实际上可以在 LC_XMIT_N_FTS
和 LC_XMIT_N_FTS_MASK
宏的定义中通过 0
移位的链接代码中准确地看到这一点。
我正在查看 Linux 的开源 AMD GPU 驱动程序。我注意到一些我以前没有见过的东西,我想知道目的。在sid.h文件的第1441行,有一系列定义是整数被左移0位。这不就是对原始整数进行运算吗?
这里是摘录和link到头
#define VGT_EVENT_INITIATOR 0xA2A4
#define SAMPLE_STREAMOUTSTATS1 (1 << 0)
#define SAMPLE_STREAMOUTSTATS2 (2 << 0)
#define SAMPLE_STREAMOUTSTATS3 (3 << 0)
https://github.com/torvalds/linux/blob/master/drivers/gpu/drm/amd/amdgpu/sid.h#L1441
此外,我正在学习访问 AMD GPU 的性能计数器寄存器以计算 GPU 负载。对此的任何提示也将不胜感激。
为了保持一致性可以这样做(不一定适用于您的具体情况)。例如,我可以将一组单位标志描述为
#define FLAG_1 0x01
#define FLAG_2 0x02
#define FLAG_3 0x04
#define FLAG_4 0x08
或
#define FLAG_1 (1u << 0)
#define FLAG_2 (1u << 1)
#define FLAG_3 (1u << 2)
#define FLAG_4 (1u << 3)
在后一种方法的第一行中,我不必移动 0
。但这样看起来更一致,并强调了 FLAG_1
与其他标志具有相同性质的事实。 0
充当不同值的占位符,如果有一天我决定更改它。
您实际上可以在 DYN_OR_EN
和 DYN_RR_EN
宏的定义中通过 0
移位的链接代码中准确地看到这一点。
该方法可以扩展到单词中的多位字段,如以下(人为的)示例
// Bits 0-3 - lower counter, bits 4-7 - upper counter
#define LOWER_0 (0u << 0)
#define LOWER_1 (1u << 0)
#define LOWER_2 (2u << 0)
#define LOWER_3 (3u << 0)
#define UPPER_0 (0u << 4)
#define UPPER_1 (1u << 4)
#define UPPER_2 (2u << 4)
#define UPPER_3 (3u << 4)
unsigned packed_counters = LOWER_2 + UPPER_3; /* or `LOWER_2 | UPPER_3` */
同样,移位 0
位纯粹是为了视觉上的一致性。以及 0
值的变化。
您实际上可以在 LC_XMIT_N_FTS
和 LC_XMIT_N_FTS_MASK
宏的定义中通过 0
移位的链接代码中准确地看到这一点。