c# - 修改字节中的特定位

标签 c# bitwise-operators

我需要修改(!不是切换异或!)字节值中的特定位。我有:

  1. 字节(例如b11010010);
  2. 要修改的位索引(例如 4);
  3. 位的新值(01)。

现在,我需要什么。如果新值为 0,则位 [4] 必须设置为 0。如果新值为 1,则位 [4] 必须设置为 1

一般部分:

var bitIndex = 4;
var byte = b11010010;
var mask = 1 << bitIndex;
var newValue = 1;

这是最简单的方法:

if(newValue == 1)
    byte |= mask; // set bit[bitIndex]
else
    byte &= ~mask; // drop bit[bitIndex]

另一种方法允许在没有 if else 语句的情况下执行此操作,但看起来很难理解:

byte = byte & ~mask | (newValue << bitIndex) & mask

这里,第一个 AND 丢弃 bit[bitIndex],第二个 AND 计算 bit[bitIndex] 的新值>,并且 ORbit[bitIndex] 设置为计算值,无论是 0 还是 1

有没有更简单的方法将特定位设置为给定值?

最佳答案

(newValue << bitIndex)只设置了一个位,不需要 & mask .

所以你只有 5 个操作。

byte = byte & ~(1 << bitIndex) | (newValue << bitIndex); // bitIndex'th bit becomes newValue

它仍然足够复杂,值得评论,但很容易看出评论是正确的,因为它是两个容易识别的操作链接在一起(不像当前接受的答案,这需要每个读者坐下来思考一个分钟)

关于c# - 修改字节中的特定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44996389/

相关文章:

c# - 将 60mb XML 文件导入 SQL

c - 使用按位运算符计算 1 的数量

java - 使用按位运算符除两个整数

string - 对某些情况的按位运算澄清

c - 如何获取负数的最后 16 位二进制数字并将它们连接起来?

c# - Asp.net Mvc FormsAuth 与 Site.Master 中的 LogonUserControl

c# - 如何使用 ViewModel-First 方法从 ViewModel 调用 View 方法

c# - 当存储过程返回结果集和异常时,ExecuteReaderAsync 不会抛出异常

c# - 在 C# 中比较两个任意长度的列表或数组;顺序很重要

无符号整数中的 C++ 按位补码返回负值