提问人:Ron Vaisman 提问时间:8/11/2022 最后编辑:GerhardRon Vaisman 更新时间:8/12/2022 访问量:363
如何使用 C 检查字节中的单个位#
how to check single bit in byte using C#
问:
我想使用 C 检查接收到的串行通信字节中的单个比特是高还是低#
我试图写这样的东西:
if(BoxSerialPort.ReadByte() & 0x01)
或
if(Convert.ToByte(BoxSerialPort.ReadByte()) & 0x01)
编译器发送以下错误:
错误 CS0029:无法隐式将类型“int”转换为“bool”
我该如何解决这个问题?
答:
2赞
Me3nTaL
8/11/2022
#1
使用 -operator&
if ((BoxSerialPort.ReadByte() & 0x01) != 0)
...
-operator 检查两个整数值的每一位,并返回一个新的结果值。&
假设你的是二进制的。BoxSerialPort
43
0010 1011
0x01
或者只是二进制。1
0000 0001
比较每个位,如果在两个操作数中都设置了相应的位,则返回。&
1
0
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
上一个:调用布尔值 vs. 不等于 -1
评论
if((BoxSerialPort.ReadByte() & 0x01) != 0)
!= 0
== 0x01