gpt4 book ai didi

C 在内存中写入位

转载 作者:行者123 更新时间:2023-12-02 08:29:23 25 4
gpt4 key购买 nike

如果我有这样一个 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 在它应该从 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.

  • 对函数名称和参数名称使用“驼峰式大小写”是符合预期的并且非常易读(尽管可以接受用“_”分隔各个单词)

  • 名称全部使用小写会使阅读/理解代码更加困难

关于C 在内存中写入位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28756671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com