如何使用 C 检查字节中的单个位#

how to check single bit in byte using C#

提问人:Ron Vaisman 提问时间:8/11/2022 最后编辑:GerhardRon Vaisman 更新时间:8/12/2022 访问量:363

问:

我想使用 C 检查接收到的串行通信字节中的单个比特是高还是低#

我试图写这样的东西:

if(BoxSerialPort.ReadByte() & 0x01)

if(Convert.ToByte(BoxSerialPort.ReadByte()) & 0x01)

编译器发送以下错误:

错误 CS0029:无法隐式将类型“int”转换为“bool”

我该如何解决这个问题?

C# 串行端口 布尔 逻辑

评论

2赞 Klaus Gütter 8/11/2022
if((BoxSerialPort.ReadByte() & 0x01) != 0)
1赞 Frederik Hoeft 8/11/2022
您在此处执行的算术 AND 运算将生成一个整数,而不是布尔值。因此,您需要检查该整数是否具有所需的值。如前所述,您可以检查 or(两者都应该有效)。!= 0== 0x01

答:

2赞 Me3nTaL 8/11/2022 #1

使用 -operator&

if ((BoxSerialPort.ReadByte() & 0x01) != 0)
...

-operator 检查两个整数值的每一位,并返回一个新的结果值。&

假设你的是二进制的。BoxSerialPort430010 1011

0x01或者只是二进制。10000 0001

比较每个位,如果在两个操作数中都设置了相应的位,则返回。&10

0010 1011

&

0000 0001

=

0000 0001(作为普通整数)1

你的 if 语句现在检查,这显然是正确的。-bit 在变量中设置。 -运算符通常可以很好地确定某个位是否设置为整数值。if (1 != 0)0x01&

评论

1赞 Ron Vaisman 8/11/2022
它有效!:)但是,如果没有相等性,它不应该也起作用吗“!= 0”?因为表达式 (BoxSerialPort.ReadByte() & 0x01) 基本上是布尔值
0赞 Me3nTaL 8/11/2022
检查我更新的问题。
0赞 Olivier Jacot-Descombes 8/11/2022
C# 不会自动将整数转换为布尔值,并且两者之间不存在显式强制转换。C# != C
1赞 Me3nTaL 8/11/2022
(BoxSerialPort.ReadByte() & 0x01)不是布尔值,它是一个整数。在你的理论中,你会写出(在 C# 中)语法错误。if (1) { ... }
0赞 t2solve 8/11/2022 #2

我会使用 compareTo

    using System;

    //byte compare 
    byte num1high = 0x01;
    byte num2low = 0x00;


    if (num1high.CompareTo(num2low) !=0)
        Console.WriteLine("not low");
    if (num1high.CompareTo(num2low) == 0)
        Console.WriteLine("yes is low");

    Console.WriteLine(num1high.CompareTo(num2low));
    Console.WriteLine(num1high.CompareTo(num1high));
    Console.WriteLine(num2low.CompareTo(num1high));

输出:

not low
1
0
-1