c#设置或者获取一个泛型整数指定bit的值

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;
        }

相关推荐

  1. c#设置或者获取一个整数指定bit

    2024-05-13 05:22:02       13 阅读
  2. c++中constexpr一个用法——在编程中作用

    2024-05-13 05:22:02       11 阅读
  3. SpringAPI获取实际类型

    2024-05-13 05:22:02       43 阅读
  4. 如何获取T真实类型

    2024-05-13 05:22:02       40 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-13 05:22:02       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-13 05:22:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-13 05:22:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-13 05:22:02       20 阅读

热门阅读

  1. iOS 沙盒图片的存取

    2024-05-13 05:22:02       14 阅读
  2. go语言切片slice使用细节和注意事项整理

    2024-05-13 05:22:02       9 阅读
  3. GO: json 处理

    2024-05-13 05:22:02       17 阅读
  4. 【GoLang基础】defer关键字有什么作用?

    2024-05-13 05:22:02       12 阅读
  5. 算法训练营day33

    2024-05-13 05:22:02       14 阅读
  6. C++:完美转发(一)(std::forward)

    2024-05-13 05:22:02       12 阅读
  7. Gone框架介绍15 - 使用traceId追踪日志

    2024-05-13 05:22:02       13 阅读
  8. Nginx使用详解

    2024-05-13 05:22:02       13 阅读
  9. Agent AI智能体:未来社会的角色、发展与挑战

    2024-05-13 05:22:02       12 阅读