gpt4 book ai didi

c - 你如何理解下面的按位运算?

转载 作者:行者123 更新时间:2023-11-30 20:58:32 25 4
gpt4 key购买 nike

我正在编写一个 C 程序,其中包含位掩码。下面的宏定义了什么?这些操作是什么<<、>>、|和 & 做什么??

1. #define SINE_PHASEREG_BASE (0x3 << 14) 
2. #define IOPORT_MODE_MUX_MASK (0x7 << 0) /*!< MUX bits mask */
3. #define IOPORT_MODE_MUX_D ( 3 << 0) /*!< MUX function D */

最佳答案

这些是执行位移操作的 C 宏。数字和硬件寄存器由最低级别的位表示。

一些 C 基础知识:

  1. 宏类似于函数,但不是调用函数,而是C 预处理器将调用宏的文本替换为宏本身。

例如,我可以创建一个简单的 C 宏来将数字加 1,如下所示:

#define ADD_ONE(x) ((x)+1)

然后我可以计算一个数字加一的值,如下所示:

int I = ADD_ONE(5);

这将被 CPP 预处理器替换为:

int I = ((5)+1);

然后编译器将其编译为等价的:

int I = 6;

请注意,此“调用”为 ADD_ONE是在编译时完成的,而不是运行时完成的,因为 ADD_ONE 是一个宏,而不是一个函数。

第 1 行到第 3 行是 C 宏,它们在编译代码之前替换调用它们的文本。有时这很棒,有时它会做你意想不到的事情。如果您坚持基础知识,它们可能非常有用,但专家可以让代码与这些东西一起跳舞。

  • 数字用二进制数表示,最右边的位(最低有效位又名 b0)表示值 0,如果bit 为零,如果为 1,则为 1,或 b0*(2^0)。
  • 为什么要用复杂的方式来表达零或一?因为,其他位使用类似的公式。位 1 代表零或二:b1*(2^1)。

    一般来说,位n代表bn*(2^n)。

    因此,如果您将 int x 设置为 5,则: X = 5=4+1 = 1*2^2+0*2^1+1*2^0 = 101(二进制)。

  • 什么是移位运算?
  • 这是计算机向左或向右移动位的方式。从数值上看,左移相当于乘以 2,右移相当于整数除以 2。

    运算符(operator)<<左移位,并且 >>右移位。 |运算符是按位或运算符,并且 &是按位与运算符。有关按位运算符的精彩介绍,请参阅这篇优秀的 answer .

    因此,如果 x 为 5,则 x<<1 为 1010b,等于 = 8+0+2+0 = 10。与 x*2 相同。

    你为什么要关心?

    因为这些宏正在执行位移操作!因此,您需要了解数字如何用二进制表示才能理解它。

    让我们看看这些宏的作用!

    <强> SINE_CONTREG_BASE (0x1 << 13)

    这会取数字 1 并将其左移 13 次,因此当使用此宏时,它会被替换为文本 (0x1 << 13)通过CPP,编译为常数值8196(即2^0 * 2^13)。因此,该宏是一种记录 SINE_CON 寄存器的第 14 位非常重要的方式,需要有一个宏来定义该位的值。

    <强> SINE_PHASEREG_BASE (0x3 << 14)

    同样,这用于表示 SINE_PHASE 寄存器中的两位二进制位字段,可以在位 15 和 14 中找到(请注意,3 是 11b)。

    <强> IOPORT_MODE_MUX_MASK

    这就是说 IOPORT_MODE_MUX寄存器是该寄存器中的前三位,掩码指的是一个值,可以通过对寄存器的值进行按位与运算来额外添加这三位。要设置这些值,可以使用按位或运算来设置该寄存器中的硬件位。

    <强> IOPORT_MODE_MUX_D

    IOPORT_MODE_MUX功能 D 位是同一寄存器中的前两位。您可以使用此宏来相应地提取或设置这两个位。

    关于c - 你如何理解下面的按位运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51885810/

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