将数字进行0位移的目的是什么?

4
我正在审查用于Linux的开源AMD GPU驱动程序。 我注意到了以前没有见过的东西,并想知道其目的。 在sid.h文件的第1441行,有一系列定义,这些定义是将整数向左位移0位。这难道不会导致对原始整数进行操作吗?
以下是摘录和头文件链接:
    #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负载。如果您有任何提示,将不胜感激。


2
这可能是由某种宏自动生成的。它可能有一个位移版本,用于位域类型值的使用,以及一个枚举类型版本。 - tadman
1
我不排除这只是代码编写错误导致的bug。我对这种事情相当熟悉,但我想不出有什么好的理由去编写这个。它可能是由于糟糕的自动代码生成器而产生的,但即使如此也相当粗糙。 - Zalman Stern
@Zalman Stern:不是的。如果这是为了将整数值放入手动实现的位域中,位偏移为0,那么通过0进行移位是非常好的编程实践。我甚至可以说,在任何自重的代码中,这是必需的 - AnT stands with Russia
好的,我明白了,不过在这种情况下,我可能会继续使用位域掩码来屏蔽它。 - Zalman Stern
1个回答

10

这样的事情可能只是为了保持一致性而完成(不一定适用于您的特定情况)。例如,我可以将一组单比特标志描述为

#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_ENDYN_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位移只是用于修饰。

而且在LC_XMIT_N_FTSLC_XMIT_N_FTS_MASK宏定义中,也存在着0值的位移。


1
给定的值是线性连续的,而不是二的幂,因此使用起来非常令人困惑。在视觉上保持概念上不同的东西——单个位标志与线性枚举——一致并没有帮助。 - Zalman Stern
@Zalman Stern:这可能意味着这些值旨在放置在包含字中偏移量为0的多位比特字段上。请参见上面的额外示例。 - AnT stands with Russia
我通常会将其移位0个单位,因为编译器肯定会将其优化掉。 - yano
在形成移位值时,良好地使用了 u - chux - Reinstate Monica
在位域上下文添加后,答案会更好。再次强调,原始标题应该记录这一点,如果这是使用情况的话。但实际上,在我丰富的编程经验中,我从未见过这种情况。我见过使用单个宏将值放入位域的技术,也见过使用命名常量作为移位偏移量。(其中一个移位常量的值可能为零。) - Zalman Stern
更重要的是,这个常量值是在编译时评估的,而这些“移位”不会出现在编译后的代码中。 - 0___________

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接