人本善良

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

将字节中的某个位赋值

复制代码
[Description("将字节中的某个位赋值")]
        public static byte SetbitValue(byte value, int offset, bool bitValue)
        {
            return bitValue ? 
                 (byte)(value | (byte)Math.Pow(2, offset)) :
                 (byte)(value & ~(byte)Math.Pow(2, offset));
        }
        /*
            这段代码是一个C#方法,用于设置一个字节(`byte`)中某一位的值。具体来说,它可以根据传入的参数将字节中的某一位设置为1或0。

            ### 参数说明
            - `value`:原始的字节值。
            - `offset`:要设置的位的偏移量(从0开始,0表示最低位,7表示最高位)。
            - `bitValue`:要设置的值,`true`表示将该位设置为1,`false`表示将该位设置为0。

            ### 方法逻辑
            1. **设置位为1**:
               - 使用按位或操作符 `|` 将目标位设置为1。
               - `Math.Pow(2, offset)` 计算出一个掩码,该掩码只有目标位为1,其他位为0。
               - 将原始字节 `value` 与掩码进行按位或操作,结果是将目标位设置为1,其他位保持不变。

            2. **设置位为0**:
               - 使用按位与操作符 `&` 和按位取反操作符 `~` 将目标位设置为0。
               - `Math.Pow(2, offset)` 计算出一个掩码,该掩码只有目标位为1,其他位为0。
               - 对掩码进行按位取反操作,得到一个只有目标位为0,其他位为1的掩码。
               - 将原始字节 `value` 与取反后的掩码进行按位与操作,结果是将目标位设置为0,其他位保持不变。

            ### 
            假设 `value = 0b10101010`(二进制),`offset = 3`,`bitValue = true`:
            - 计算掩码:`Math.Pow(2, 3) = 8`,即 `0b00001000`。
            - 执行按位或操作:`0b10101010 | 0b00001000 = 0b10101010`(结果不变,因为第3位已经是1)。

            如果 `bitValue = false`:
            - 计算掩码:`Math.Pow(2, 3) = 8`,即 `0b00001000`。
            - 取反掩码:`~0b00001000 = 0b11110111`。
            - 执行按位与操作:`0b10101010 & 0b11110111 = 0b10100010`(第3位被设置为0)。

            ### 
            这个方法通过位操作来高效地设置字节中的某一位,适用于需要精确控制字节中每一位的场景,如硬件控制、协议解析等。
                     */
复制代码

 

posted on   简简单单2018  阅读(23)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示