C 在内存中写入位

C Write Bit in Memory

如果我有这样一个 8 位数, 00101001

目前在我的代码中有两个函数,如下所示:

void ADDSET(unsigned char *signalmask, int SIGNUM) {
    *signalmask = *signalmask | (SIGNUM);
}

void DELSET(unsigned char *signalmask, int SIGNUM) {
    *signalmask = *signalmask &~ SIGNUM;
}

像这样的函数调用:

int main() {
    unsigned char signalmask = 41;
    int SIGNUM = 7; // signal 1-8

    ADDSET(&signalmask, SIGNUM);

    return 0;
}

出于某种原因,当我输出 signalmask 的内存地址时,它要么没有 replace/remove 位,要么输入了错误的一位。我认为这是因为 SIGNUM 在应该从 1 开始时从 0 开始。

我输出使用:

for (i = 0; i < 8; i++) {
    printf("%d", !!((signalmask << i) & 0x80));
}

有人可以帮我吗?

注意: 我的 INSET 函数按预期运行:

int INSET(unsigned char signalmask, int SIGNUM){
    unsigned char bitMask = 1 << (SIGNUM - 1);
    if ((signalmask & bitMask) == 0)
        return 0;
    else
        return 1;
}

我的问题是我不知道如何将此代码移植到 ADDSETDELSET 函数。

提前致谢。

鉴于符号 (=7) 的描述,代码应类似于:

void addSet(unsigned char *signalMask, int sigNum) 
{ // turn bit ON
    *signalMask = *signalMask | (1<<sigNum);
} // end function: addSet

void selSet(unsigned char *signalMask, int sigNum) 
{ // turn bit OFF
    *signalMask = *signalMask & ~(1<<sigNum);
}

我还会检查 signum 是否在范围内 (0...31)

General practice is only macro names and constants are all CAPS.

  • 对函数名称和参数名称使用 'camel case' 是预期的并且非常易读(尽管可以接受用“_”分隔各个单词)

  • 名称全部使用小写会使 reading/understanding 代码更加困难

等效但稍微更紧凑的语法是:

void ADDSET(unsigned char *signalmask, int SIGNUM) {
    *signalmask |= (1 << SIGNUM);
}

void DELSET(unsigned char *signalmask, int SIGNUM) {
    *signalmask &= ~(1 << SIGNUM);
}

如果您只是想切换那里的任何内容(即 1->00->1):

void TOGGLESET(unsigned char *signalmask, int SIGNUM) {
    *signalmask ^= (1 << SIGNUM);
}