C 在内存中写入位
C Write Bit in Memory
如果我有这样一个 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
的内存地址时,它要么没有 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;
}
我的问题是我不知道如何将此代码移植到 ADDSET
和 DELSET
函数。
提前致谢。
鉴于符号 (=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->0
或 0->1
):
void TOGGLESET(unsigned char *signalmask, int SIGNUM) {
*signalmask ^= (1 << SIGNUM);
}
如果我有这样一个 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
的内存地址时,它要么没有 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;
}
我的问题是我不知道如何将此代码移植到 ADDSET
和 DELSET
函数。
提前致谢。
鉴于符号 (=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->0
或 0->1
):
void TOGGLESET(unsigned char *signalmask, int SIGNUM) {
*signalmask ^= (1 << SIGNUM);
}