有PLC开发背景,如何在C#中便捷读写byte/int的指定位?
C#中byte/int指定位的便捷读写方法
基础位运算方式
C#原生支持直接位运算,比累加方式更高效,核心用|(或运算)设定位、&(与运算)读取位、^(异或运算)翻转位:
- 设置指定位为true:
byte var1 = 0; var1 |= (byte)(1 << 2); // 设置第3位(索引从0开始)为true - 读取指定位的值:
bool bitValue = (var1 & (1 << 2)) != 0; // 判断第3位是否为true - 设置指定位为false:
var1 &= (byte)~(1 << 2); // 清除第3位
封装成类似PLC的便捷扩展方法
如果想贴近PLC里Var1.X2 := true的写法,可以给byte/int类型写扩展方法,封装位操作逻辑,用起来更直观:
public static class BitExtensions { // 设置byte的指定位 public static void SetBit(this ref byte value, int bitIndex, bool isTrue) { if (bitIndex < 0 || bitIndex > 7) throw new ArgumentOutOfRangeException(nameof(bitIndex), "byte类型的位索引只能是0-7"); if (isTrue) value |= (byte)(1 << bitIndex); else value &= (byte)~(1 << bitIndex); } // 读取byte的指定位 public static bool GetBit(this byte value, int bitIndex) { if (bitIndex < 0 || bitIndex > 7) throw new ArgumentOutOfRangeException(nameof(bitIndex), "byte类型的位索引只能是0-7"); return (value & (1 << bitIndex)) != 0; } // int类型对应的位操作扩展 public static void SetBit(this ref int value, int bitIndex, bool isTrue) { if (bitIndex < 0 || bitIndex > 31) throw new ArgumentOutOfRangeException(nameof(bitIndex), "int类型的位索引只能是0-31"); if (isTrue) value |= 1 << bitIndex; else value &= ~(1 << bitIndex); } public static bool GetBit(this int value, int bitIndex) { if (bitIndex < 0 || bitIndex > 31) throw new ArgumentOutOfRangeException(nameof(bitIndex), "int类型的位索引只能是0-31"); return (value & (1 << bitIndex)) != 0; } }
使用时逻辑和PLC写法一致(注意位索引从0开始,对应PLC的X0-X7/X31):
byte var1 = 0; var1.SetBit(2, true); // 对应PLC的Var1.X2 := true bool isSet = var1.GetBit(2); // 读取第3位的值
额外选项:BitArray类
如果需要批量操作多位,可使用System.Collections.BitArray,适合处理多比特场景:
BitArray bits = new BitArray(new byte[] { var1 }); bits[2] = true; // 设置第3位 bits.CopyTo(new byte[] { var1 }, 0); // 写回byte变量
内容的提问来源于stack exchange,提问作者KevinM
相关产品推荐
相关产品推荐

