打印

第一次见这种定义方式

[复制链接]
1091|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hanwe|  楼主 | 2022-9-9 22:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#define bitset(var, bitno)   ((var) |= (1 << (bitno)))
#define bitclr(var, bitno)   ((var) &= ~(1 << (bitno)))
这个宏定义,是用来干什么的啊,有谁能给我解释一下,谢谢了!
union {
         struct {
            unsigned b0:1;
            unsigned b1:1;
            unsigned b2:1;
            unsigned b3:1;
            unsigned b4:1;
            unsigned b5:1;
            unsigned b6:1;
            unsigned b7:1;
            }oneBit;
           unsigned char allBits;
          } myFlag;
#define CNT2_1 myFlag.oneBit.b1
#define CNT2_2 myFlag.oneBit.b2
#define CNT2_3 myFlag.oneBit.b3
#define CNT2   myFlag .allBits
第一次见这种定义方式,知道有unsigned char unsigned int 这种unsigned b0.。。啥意思?

使用特权

评论回复
沙发
pengf| | 2022-9-9 22:23 | 只看该作者
前面两个名字写的很清楚,一个是设置一个字节中的一个BIT位的,一个是清除一个字节中的一个BIT位的,联合及结构是用来定义一个字节中的各个位的,这样定义后,好直接操作了。

使用特权

评论回复
板凳
hanwe|  楼主 | 2022-9-9 22:26 | 只看该作者
第一个问题我明白了。把后面的展开就是VAR=VAR||(0X01<<(bitno)) 和VAR=VAR&&(~(0X01<<(bitno))) 那个1的写法把我迷惑了,bitno的值只能取0-7。

使用特权

评论回复
地板
hanwe|  楼主 | 2022-9-9 22:29 | 只看该作者
第二个问题还是有些不理解,unsigned b0:1 具体含义是什么呢?结构体和共用体的用法我都明白,只是放到单片机里的型式有些奇怪

使用特权

评论回复
5
hanwe|  楼主 | 2022-9-9 22:31 | 只看该作者
#define CNT2   myFlag .allBits,是不是定义了一个字节变量,#define CNT2_1 myFlag.oneBit. b1  CNT2_1 是只哪个字节的第一位呢?初始值是多少,是1吗?

使用特权

评论回复
6
heweibig| | 2022-9-9 22:35 | 只看该作者
找个c语言的书看看啊,位域操作那一章,你就明白了

使用特权

评论回复
7
weifeng90| | 2022-9-11 14:02 | 只看该作者
为了方便位操作

使用特权

评论回复
8
gouguoccc| | 2022-9-11 18:13 | 只看该作者
这是位操作

使用特权

评论回复
9
tpgf| | 2022-10-8 21:09 | 只看该作者
这个是结构体还是联合体啊 感觉特别的陌生

使用特权

评论回复
10
chenqianqian| | 2022-10-8 22:01 | 只看该作者
就是宏定义啊

使用特权

评论回复
11
qcliu| | 2022-10-9 08:12 | 只看该作者
应该是定义了一个字节的八个bit

使用特权

评论回复
12
drer| | 2022-10-9 08:20 | 只看该作者
#define bitset(var, bitno)   ((var) |= (1 << (bitno)))用于位置位
#define bitclr(var, bitno)   ((var) &= ~(1 << (bitno)))用于位清零

使用特权

评论回复
13
coshi| | 2022-10-9 08:42 | 只看该作者
分别对应的一个字节八位 这样做方便后续操作

使用特权

评论回复
14
kxsi| | 2022-10-9 08:55 | 只看该作者
hanwe 发表于 2022-9-9 22:26
第一个问题我明白了。把后面的展开就是VAR=VAR||(0X01

不是的 bitno只能取0或者1  因为它只是一个二进制的一位

使用特权

评论回复
15
wiba| | 2022-10-9 09:11 | 只看该作者
hanwe 发表于 2022-9-9 22:31
#define CNT2   myFlag .allBits,是不是定义了一个字节变量,#define CNT2_1 myFlag.oneBit. b1  CNT2_1  ...

可以是任何一位 不过这样定义的话 常用在相应的尾数标识的哪一位 这样做就是为了方便识别用的

使用特权

评论回复
16
Henryko| | 2022-11-5 20:00 | 只看该作者
为了方便位操作

使用特权

评论回复
17
LOVEEVER| | 2022-11-26 20:11 | 只看该作者
写的比较方便操作的位操作,写法楼主后期编程可以借鉴

使用特权

评论回复
18
OKAKAKO| | 2022-11-27 10:12 | 只看该作者
bitset(var, bitno) 这个就是((var) |= (1 << (bitno)))意思,一个宏定义的替代

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

979

主题

8749

帖子

4

粉丝