C在内存中写入位

时间:2015-02-27 02:45:49

标签: c memory binary bit

如果我有这样的8位数, 00101001

  • 如何用1替换其中一个位(设置位)?
  • 如何用0?
  • 替换其中一个位

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

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的内存地址时,它不会替换/删除该位,或者它会执行错误的操作。我认为这是因为SIGNUM从0开始,应该从1开始。

我使用输出:

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函数。

提前致谢。

2 个答案:

答案 0 :(得分:3)

鉴于signum(=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);
}

我还会检查签名是否在范围内(0...31

  

一般做法只是宏名称和常量都是CAPS。

  • 使用&#39;骆驼案例&#39;对于函数名称和参数名称是期望的并且非常易读(尽管可以使用&#39; _&#39;分隔单个单词)

  • 使用全部小写字母表示阅读/理解代码更加困难

答案 1 :(得分:3)

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

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);
}