如果我有这样的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
的内存地址时,它不会替换/删除该位,或者它会执行错误的操作。我认为这是因为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;
}
我的问题是我不知道如何将此代码移植到ADDSET
和DELSET
函数。
提前致谢。
答案 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->0
或0->1
):
void TOGGLESET(unsigned char *signalmask, int SIGNUM) {
*signalmask ^= (1 << SIGNUM);
}