如何解决C ++按位布尔
我正在尝试找出创建适合字节操作的布尔类型的有效方法。 例如:
this._dialogService.open(`blah`,{ header: 'some header' })
现在,我想让以下表达式返回定义的BOOL之一-例如,如果我使用表达式// in component Nav
componentDidMount() {
this.authListener = firebase.auth().onAuthStateChanged(user => {
if (!user) {
this.setState({ navType: "public" });
} else {
user.getIdTokenResult().then(IdTokenResult => {
if (!!IdTokenResult.claims.admin) {
this.setState({ navType: "admin" });
} else {
this.setState({ navType: "user" });
}
});
}
});
}
componentWillUnmount() {
// Do not forget to stop listening to the auth state when unmounting
if (this.authListener) {
this.authListener();
}
}
,它将返回我的按位BOOL之一,而不是标准布尔值。我希望这是为了能够将if语句替换为按位操作:
unsigned char TRUE_BOOL = ~unsigned char(0);
unsigned char FALSE_BOOL = unsigned char(0);
可以采用哪些方法(即返回BOOL而不是标准)?我有一些想法,但我想知道是否存在更好的方法。
解决方法
您可以创建一个自定义布尔类,当将其隐式转换为无符号int时,其结果为~0
或0
,例如:
class BOOL {
unsigned int value;
public:
BOOL(bool value): value(value ? ~0 : 0) {}
operator unsigned int() {
return value;
}
};
然后您可以编写:
unsigned char Result = (BOOL(a < b) & 13) | (BOOL(a >= b) & 17);
您想要做什么。但是我不推荐这样做,因为编译器已经为您完成了这些优化。例如,您可以使用以下命令代替使用上面的用&
运算符编写表达式的方式:
unsigned char Result = ((a < b) * 13) | ((a >= b) * 17);
但是,正如评论中提到的那样,缺少if
语句并不意味着它仍然不能包含条件分支。不过要注意的一件事是13
和17
之间的区别只是4
,您可以这样写:
unsigned char Result = 13 + ((a >= b) << 2);
所有这些方法都由编译器进行了优化,以生成完全相同的指令,如godbolt.org所示。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。