0

我对 C 很陌生,我来自 Web 开发背景,所以我有点不确定我见过 C 程序员使用的一些位和字节编码。我正在查看一些将参数传递给函数的 C 代码。

insert_chem(int jobId, ...);

而当这个函数被调用时,传入的jobId其实是一个常量,原来是这样定义的:

CYCLE_JOB_MEM = 0x00020000

它会像这样使用:

insert_chem(CYCLE_JOB_MEM, ...);

我已经看到这可以与相同的第一个参数一起传递:

#define DETAILS 0x80000000

像这样:

insert_chem(CYCLE_JOB_MEM|DETAILS, ...);

这里到底发生了什么?这段代码很老了,C 还使用这样的做法吗?如果有人能给我一些关键词和一个简单的解释,那么我可以继续研究这个。

对不起,如果这东西很简单!

更新:

这些似乎是十六进制值,如何传入多个值?输入函数时它们是否分开?为什么不首先传递多个参数?

4

3 回答 3

1

这是将一个参数用于多个事物的经典方式,通常称为“位掩码”或“位标志”。这里的关键是理解数字在计算机中是如何表示的,以及运算符“或”( |)。

如果您了解数字是如何存储在计算机中的,以及 or 运算符是如何工作的,那么剩下的就很简单了。

为什么不使用多个参数?好吧,如果只有两个,那么也许这不是一个大问题,但想象一下,如果你有 16 个不同的选项?

于 2012-12-20T22:16:03.773 回答
1

这是一个不错的简单... 在“CYCLE_JOB_MEM|DETAILS”中对这两个值执行二进制或运算。将 0x10 与 0x02 进行或运算的结果将是 0x12。

在您的情况下,它是 OR-ing 0x00020000 与 0x80000000 导致 0x80020000 的值作为参数传入。

编辑:这种事情通常是通过通信数据包完成的。其中每个位用于指示不同的条件或故障(例如)。这样,您可以用一个字节指示 8 个布尔(真/假)条件。

#define PACKET_ACK 0x80
#define PACKET_NAK 0x40
#define PACKET_ERR 0x20
#define PACKET_WTF 0x10
#define PACKET_LOL 0x01

ETC...

如果您传入 (PACKET_ACK|PACKET_WTF),传入参数的值为 0x81。

然后通常由(根据评论)处理

if ( arg & PACKET_ACK ){/*do some stuff*/}
if ( arg & PACKET_WTF ){/*do some other stuff*/}
于 2012-12-20T22:18:01.600 回答
1

单一|的是按位或运算符。对两个操作数中的每一位执行布尔或运算。例如,2 和 4 的按位或运算是

  0010
| 0100
------
  0110

给出值 6。结果CYCLE_JOB_MEM|DETAILS是 0x80020000;这是作为第一个参数传递给insert_chem.

有关更多信息,请搜索“C 位运算符”。

于 2012-12-20T22:19:41.977 回答