You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:45:32