[英]bitwise operator use in C++/WinRT CharacteristicProperties()
使用 C++/WinRT、蓝牙 LE、VS2017、Win10
我的蓝牙 LE 设备有一个可读写的特性。
当检查服务的各种特性的属性时,例如:
if (characteristic.CharacteristicProperties() == GattCharacteristicProperties::Write)
{
std::wcout << "IsWriteable = true; ";
}
读/写特性不会被::Write 命中,也不会被::Read 命中。 文档说
此枚举支持其成员值的按位组合。
所以我尝试了 AND & 运算符,因为这是 Read AND Write
if (characteristic.CharacteristicProperties() == (GattCharacteristicProperties::Read & GattCharacteristicProperties::Write))
{
std::wcout << "IsReadWrite = true; ";
}
然而,这也没有受到打击。 Read 的枚举值为 2,Write 的枚举值为 8,在 Debug 中,此特性属性显示为“Read | Write (10)”。 所以我使用了 OR | 上面代码段中的运算符和那个命中。
我的问题是,为什么::Read 没有命中并且::Write 没有命中但是::Read OR::Write 命中并且::Read AND::Write 没有命中?
只是有点好奇,因为这对我来说没有意义。
这是基本的位检查。
enum { Flag1 = 2, Flag2 = 8 };
检查一个位: if (x & Flag1)...
检查是否设置了两个位中的任何一个: if (x & (Flag1 | Flag2))...
检查是否设置了两个位: if ((x & (Flag1 | Flag2)) == (Flag1 | Flag2))...
之前的检查可以重写为:
auto const bits = Flag1 | Flag2;
if ((x & bits) == bits)...
在您的情况下, Flag1 & Flag2
始终为 0( 2 & 8
为 0)。
x == (Flag1 | Flag2)
仅在x
不包含其他位(即不相关的标志)时才有效。 2 | 8
2 | 8
是 10。
这不是按位逻辑运算符的工作方式。 当您说CharacteristicProperties() == (Read & Write)
时,这并不意味着必须等于Read
AND Write
。 这意味着将值与对Read
和Write
执行按位与的结果进行比较。 这些值是b0010
和b1000
(二进制),并且操作返回值 0。
您要实现的是检查是否设置了这两个位。 这是通过对标志执行按位或运算并比较结果来完成的:
if (characteristic.CharacteristicProperties() == (GattCharacteristicProperties::Read | GattCharacteristicProperties::Write))
{
std::wcout << "IsReadWrite = true; ";
}
这将验证属性是否完全等于Read
和Write
标志的组合。
虽然更常见的是检查这些标志是否已设置(可能除了其他标志之外)。 使用p
、 r
和w
作为属性、读取和写入标志,以下表达式执行此操作:
auto const mask = r | w;
if ((p & mask) == mask) { ... }
另一个常见的操作是验证是否设置了一组给定标志的任何标志,例如
auto const mask = r | w;
if ((p & mask) != 0) { ... }
我在 CodeProject 上看到了一篇文章,帮助我了解了按位运算符中的逻辑。 我在考虑 C++ && || 逻辑,但 CodeProject 帖子有这个
CodeProject 表不会在此处复制和粘贴,但它显示:
A = 0011,B = 0101
A 和 B = 0001(即 A 和 B 中的内容)
A 或 B = 0111(即 A 或 B 中的内容)
我相信上面很多话都提到了这一点,但这张简单的表格是我的大脑需要看到的二进制逻辑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.