相关疑难解决方法(0)

C中宏的括号需要

我试着SQR在下面的代码中使用宏的定义:

#define SQR(x) (x*x)
int main()
{
    int a, b=3;
    a = SQR(b+5);      // Ideally should be replaced with (3+5*5+3), though not sure.
    printf("%d\n",a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它打印23.如果我将宏定义更改为SQR(x) ((x)*(x))然后输出是预期的,64.我知道在C中调用宏会用宏的定义替换调用,但是我仍然无法理解它是如何计算的23.

c macros parentheses c-preprocessor

28
推荐指数
4
解决办法
2万
查看次数

将n个连续位设置为1的最有效方法是什么?

我想得到一个函数,将n数值类型的最后几位设置为1.例如:

bitmask (5) = 0b11111 = 31
bitmask (0) = 0
Run Code Online (Sandbox Code Playgroud)

我,第一,有此实现(mask_t只是typedef周围uint64_t):

mask_t bitmask (unsigned short n) {
  return ((((mask_t) 1) << n) - 1;
}
Run Code Online (Sandbox Code Playgroud)

一切都很好,除非函数命中bitmask (64)(大小mask_t),然后我得到bitmask (64) = 064位设置为1.

所以,我有两个问题:

  1. 为什么我有这种行为?按下1左侧的64个移位应该清除寄存器并保持0,然后应用-1应该用1s 填充寄存器...

  2. 实现此功能的正确方法是什么?

c bit-manipulation

3
推荐指数
1
解决办法
237
查看次数