繁体   English   中英

C++/WinRT CharacteristicProperties() 中的位运算符使用

[英]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 这意味着将值与对ReadWrite执行按位与的结果进行比较。 这些值是b0010b1000 (二进制),并且操作返回值 0。

您要实现的是检查是否设置了这两个位。 这是通过对标志执行按位或运算并比较结果来完成的:

if (characteristic.CharacteristicProperties() == (GattCharacteristicProperties::Read | GattCharacteristicProperties::Write))
{
    std::wcout << "IsReadWrite = true; ";
}

这将验证属性是否完全等于ReadWrite标志的组合。

虽然更常见的是检查这些标志是否已设置(可能除了其他标志之外)。 使用prw作为属性、读取和写入标志,以下表达式执行此操作:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM