gpt4 book ai didi

计算任何数据类型的奇数位的 C 宏

转载 作者:太空宇宙 更新时间:2023-11-04 06:57:40 24 4
gpt4 key购买 nike

我需要编写一个宏来计算奇数位置的位(在 ANSI C 中)。例如,在 1010 中,此类位的计数为 2,而在 0101 中,此类位的计数为 0。

这是我想出的宏:

#include <stdio.h>
#define BIT_IN_BYTE 8

#define size(x,t) { \
int i, sum = 0; \
for(i = 0; x; x >>= 1) { \
if( (x & 1) && (i % 2) != 0) { \
sum++; \
} \
i++; \
} \
t = sum; \
} \

int main() {
int b = 44444, result;
size(b, result);
printf("count = %d\n", result);

return 0;
}

我真的有 2 个问题:我是否可以以一种不需要在其签名中使用两个参数的方式编写宏,更重要的是,是否有一种相对简单的方法将宏扩展到 floatdouble 类型。

最佳答案

正如在对您的问题的评论中,在此处使用宏确实不是好的做法。您应该真正使用函数来代替 - 内联或其他方式。

由于您显然出于无法控制的原因被迫在您的案例中使用宏,因此这里有一些与您的示例相关的要点:

  • 您可以使用sizeof 来获取您在x 参数中传递的任何类型 的字节数。这可能允许您将宏概括为具有不同大小的不同类型(您提到 floatdouble)。
  • 由于宏不进行类型检查,如果您有一些以通用方式适用于 int 的东西 - 可能使用按位操作 - 你将有机会让它工作对于其他类型。不过,我再次指出,缺乏类型安全是在许多情况下避免使用宏的原因。
  • 如对您的问题的评论所述,您当前的方法会破坏您作为参数 x 传递的任何值。这可能是不希望的和不必要的。
  • 如果您可以重写它,使其计算为一个数字,您将只能避免传递第二个参数。对于这个人为的例子,我没有动力去弄清楚如何做到这一点,或者这是否真的可行。

关于计算任何数据类型的奇数位的 C 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42098825/

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