我是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仍然使用这样的做法吗?如果有人可以提供一些关键字和一个简单的解释,那么我可以继续研究这个。
对不起,如果这个东西很简单!
更新:
这些似乎是十六进制值,多个值是如何传入的?输入功能时它们会分开吗?为什么不首先传递多个参数?
答案 0 :(得分:1)
这是将一个参数用于多个事物的经典方法,通常称为“bitmask”或“bitflags”。这里的关键是要了解数字在计算机中的表示方式,以及运算符“或”(|
)。
如果您了解数字如何存储在计算机中,以及数字或运算符的工作方式,那么其余部分就非常简单。
为什么不参加多个参数?好吧,如果它只有两个,那么也许这不是一个大问题,但想象一下,如果你有16个不同的选择?
答案 1 :(得分:1)
这是一个很容易的... ...在“CYCLE_JOB_MEM | DETAILS”中对两个值执行二进制OR运算。 OR-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
等...
如果传入(PACKET_ACK | PACKET_WTF),传入参数的值为0x81。
然后通常由(根据评论)
处理if ( arg & PACKET_ACK ){/*do some stuff*/}
if ( arg & PACKET_WTF ){/*do some other stuff*/}
答案 2 :(得分:1)
单个|
是按位或运算符。对两个操作数中的每个位执行布尔OR运算。例如,2和4的按位或操作是
0010
| 0100
------
0110
给出值6. CYCLE_JOB_MEM|DETAILS
的结果是0x80020000;这是作为insert_chem
的第一个参数传递的值。
有关更多信息,请使用Google“C位运算符”。