gpt4 book ai didi

c - 声明二进制旋转预处理器宏的正确方法

转载 作者:行者123 更新时间:2023-12-01 21:57:10 25 4
gpt4 key购买 nike

我想创建用于二进制旋转的宏。我的目标是使这些宏对于 uint32_tuint64_t 操作数类型通用。

我来到了这个实现:

#define ROTL(X, N)  (((X) << (N)) | ((X) >> (8 * sizeof(X) - (N))))
#define ROTR(X, N) (((X) >> (N)) | ((X) << (8 * sizeof(X) - (N))))

这些宏工作正常,但 gcc 编译器在编译期间会产生警告:

warning: right shift count >= width of type [enabled by default]
#define ROTL(X, N) (((X) << (N)) | ((X) >> (8 * sizeof(X) - (N))))

warning: left shift count >= width of type [enabled by default]
#define ROTL(X, N) (((X) << (N)) | ((X) >> (8 * sizeof(X) - (N))))

我知道编译器提示 XN 的类型可能不匹配。但即使我同时转换 XN 也会产生警告:

ROTL((uint32_t)0xdeadbeef, (uint32_t)0U);

我该怎么做才能以正确的方式消除这些警告?

最佳答案

当第二个参数为零或大于第一个参数的位数时,您会遇到一些问题。您可以尝试使用该模块来解决这个问题。通过这个简单的例子,这似乎可行:

#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>
#include <limits.h>

#define ROTL(X, N) \
(((X) << ((N) % (CHAR_BIT * sizeof(X)))) | \
((X) >> ((CHAR_BIT * sizeof(X) - (N)) % (CHAR_BIT * sizeof(X)))))

int main() {
for (int i = 0; i < 100; i++) {
uint32_t a = ROTL(UINT32_C(0xdeadbeef), i);
printf("%d\t%"PRIX32"\n", i, a);
}
return 0;
}

我使用了 limits.h 中的 CHAR_BIT 以及 inttypes 中的 UINT32_CPRIX32。 h.您可以自行调整ROTR来执行相同的操作。

关于c - 声明二进制旋转预处理器宏的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52608994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com