1.设置
代码如下(示例):
/// <summary>/// 设置一个整形数的每一个bit的值/// </summary>/// <typeparam name="T"></typeparam>/// <param name="flag">bit位0或者1</param>/// <param name="num">需要改变的数</param>/// <param name="offset">从右往左第几位,从0开始</param>/// <returns></returns>T Changebit<T>(bool flag, T num, int offset) where T : struct{// 确保 T 是一种整数类型int len = 0;if (_data is uint ){len = sizeof(uint) * 8;}else if (_data is int){len = sizeof(int) * 8;}else if (_data is long){len = sizeof(long) * 8;}else if (_data is ulong){len = sizeof(ulong) * 8;}else if (_data is short){len = sizeof(short) * 8;}else if (_data is ushort){len = sizeof(ushort) * 8;}else if (_data is byte){len = sizeof(byte) * 8;}else{throw new InvalidOperationException("Only integer types are supported.");}if (index > len || index < 0)throw new InvalidOperationException("Length too long.");// 将 T 转换为整数,以便进行位操作dynamic value = num;// 创建一个掩码,指定偏移量位置int mask = 1 << offset;if (flag){// 如果 flag 为真,设置相应位置的位value |= mask;}else{// 如果 flag 为假,清除相应位置的位value &= ~mask;}// 返回处理后的结果return (T)value;}
2.get每一个bit位
代码如下(示例):
bool GetIntBit<T>(T _data, int index){int len = 0;if (_data is uint){len = sizeof(uint) * 8;}else if (_data is int){len = sizeof(int) * 8;}else if (_data is long){len = sizeof(long) * 8;}else if (_data is ulong){len = sizeof(ulong) * 8;}else if (_data is short){len = sizeof(short) * 8;}else if (_data is ushort){len = sizeof(ushort) * 8;}else if (_data is byte){len = sizeof(byte) * 8;}else{throw new InvalidOperationException("Only integer types are supported.");}if (index > len || index < 0){throw new ArgumentOutOfRangeException();}dynamic b = _data;return (b & (1 << index)) != 0;}