您的位置:首页 > 财经 > 金融 > C#【必备技能篇】替换一个字节(byte)中连续几位(bit)的内容

C#【必备技能篇】替换一个字节(byte)中连续几位(bit)的内容

2024/11/16 20:14:50 来源:https://blog.csdn.net/sinat_40003796/article/details/142042794  浏览:    关键词:C#【必备技能篇】替换一个字节(byte)中连续几位(bit)的内容

文章目录

  • 一、一个示例
  • 二、通用方法

一、一个示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp1
{class Program{static void Main(string[] args){Method1();}public static void Method1(){// 假设这是你的原始字节  byte originalByte = 0b10101010; // 二进制表示为 10101010  // 假设你想从第3位开始更改接下来的3位(注意:位是从0开始计数的)  // 新的值是 011(二进制),它将被放入原始字节的第3到第5位  // 首先,我们需要一个掩码来清除第3到第5位  int V = ~(0b111 << 3);byte mask = (byte)V; // 使用 ~ 操作符创建掩码,这里将 0111 左移3位得到 111000,然后取反得到 000111  Console.WriteLine($"mask: {Convert.ToString(mask, 2).PadLeft(8, '0')}");// 清除原始字节中的旧值  byte clearedByte = (byte)(originalByte & mask); // 现在 clearedByte 在第3到第5位上是0,其他位保持不变  Console.WriteLine($"clearedByte: {Convert.ToString(clearedByte, 2).PadLeft(8, '0')}");// 现在设置新值,将 011 左移3位(因为我们从第3位开始设置)  byte newValue = (byte)((0b011 << 3) & 0xFF); // 0xFF 确保结果是一个字节  Console.WriteLine($"newValue: {Convert.ToString(newValue, 2).PadLeft(8, '0')}");// 将新值放入原始字节的相应位置  byte finalByte = (byte)(clearedByte | newValue);// 输出结果  Console.WriteLine($"Original: {Convert.ToString(originalByte, 2).PadLeft(8, '0')}");Console.WriteLine($"Final:    {Convert.ToString(finalByte, 2).PadLeft(8, '0')}");Console.ReadLine();}}
}

输出结果:

mask: 11000111
clearedByte: 10000010
newValue: 00011000
Original: 10101010
Final:    10011010

二、通用方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp1
{class Program{static void Main(string[] args){Method2();}private static void Method2(){// 假设这是你的原始字节  byte originalByte = 0b10101010; // 二进制表示为 10101010  // 假设你想从第3位(从0开始计数)开始更改接下来的2位  int startPos = 3;int numBits = 3;// 创建一个掩码来清除目标位  byte mask = (byte)((1 << numBits) - 1); // 创建一个只在最低numBits位为1的掩码  mask = (byte)(mask << startPos); // 将掩码左移startPos位  mask = (byte)(~mask); // 取反掩码,得到要清除的位的掩码  Console.WriteLine($"mask: {Convert.ToString(mask, 2).PadLeft(8, '0')}");// 清除原始字节中的旧值  byte clearedByte = (byte)(originalByte & mask); // 使用mask来清除目标位  Console.WriteLine($"clearedByte: {Convert.ToString(clearedByte, 2).PadLeft(8, '0')}");// 假设这是新的值(以二进制形式表示,但这里我们将其转换为整数)  // 例如,新的值是111(二进制),但我们需要左移它以匹配startPos  int newValue = 0b111; // 注意:这里newValue是一个int,因为我们稍后会进行左移  newValue = newValue << startPos; // 将newValue左移到正确的位置  Console.WriteLine($"newValue: {Convert.ToString(newValue, 2).PadLeft(8, '0')}");// 注意:newValue现在可能是一个大于byte的int,但我们只关心它的最低8位  // 因此,我们可以直接进行位或操作,因为byte类型在C#中会自动进行模256操作  byte finalByte = (byte)(clearedByte | (byte)newValue);// 输出结果  Console.WriteLine($"Original: {Convert.ToString(originalByte, 2).PadLeft(8, '0')}");Console.WriteLine($"Final:    {Convert.ToString(finalByte, 2).PadLeft(8, '0')}");Console.ReadLine();}}
}

输出结果:

mask: 11000111
clearedByte: 10000010
newValue: 00111000
Original: 10101010
Final:    10111010

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com