gpt4 book ai didi

c - 在 C 中设置标志与在汇编语言中一样优雅

转载 作者:太空狗 更新时间:2023-10-29 14:51:49 26 4
gpt4 key购买 nike

与汇编相比,C 中的标志处理感觉很麻烦。

我正在寻找一种使 C 代码像汇编代码一样可读的方法。

在汇编中:

#define powerOn flagsByte,0
...
bsf powerOn ; Turn on the power
bcf powerOn ; Turn off the power
btfsc powerOn ; If the power is on...

在 C 中:

flagsByte |= (1 << 0) ; // Turn on the power
flagsByte &= ~(1 << 0) ; // Turn off the power
if (flagsByte & (1 << 0)); // If the power is on...

在 C 中,使用宏:

#define BIT_SET(var,bitNo) (var |= (1<<(bitNo)))
BIT_SET(flagsByte,0) ; // Turn on the power

这行得通,但它仍然不如汇编那样干净。

我愿意做:

#define powerOn flagsByte,0
BIT_SET(powerOn) ; // Turn on the power

但这行不通,因为它扩展为:

flagsByte,0 |= (1<<())

代替:

flagsByte |= (1<<(0))

问题:

在 C 中是否有一种优雅的方法来设置、清除或测试定义如下的标志?

#define powerOn flagsByte,0

最佳答案

就个人而言,我更喜欢位域语法,并且没有宏,因为无论如何我的标志几乎总是在结构内部。但是,如果您坚持用 C 编写汇编程序,方法如下:

/* We need to indirect the macro call so that the pair of arguments get expanded */
#define BITSET_(f,i) do{f|= 1<<(i);}while(0)
#define BITCLR_(f,i) do{f&=~(1<<(i));}while(0)
#define BITCHK_(f,i) ((f)&(1<<(i)))

#define BITSET(fi) BITSET_(fi)
#define BITCLR(fi) BITCLR_(fi)
#define BITCHK(fi) BITCHK_(fi)

/* Define the flag container and bit number as per OP */
#define poweron flags1,0
#define warnuser flags7,4

/* Sample uses */
BITSET(poweron);
BITCLR(warnuser);
/* Since BITCHK expands to a parenthesized expression, I can get away with
* leaving out the parentheses in the if statement. Not saying that's a good
* idea or anything.
*/
if BITCHK(poweron) BITSET(warnuser);

如果你有 gcc,你可以用 gcc -E flag_macros.c 验证这一点

关于c - 在 C 中设置标志与在汇编语言中一样优雅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23163921/

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