当前位置: 首页 > news >正文

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
http://www.lryc.cn/news/438056.html

相关文章:

  • roboguide将tp程序转化为LS文本格式的方法
  • 基于SpringBoot+Vue+MySQL的流浪猫狗宠物救助救援网站管理系统
  • I/O 多路复用:`select`、`poll`、`epoll` 和 `kqueue` 的区别与示例
  • 大数据之Flink(三)
  • 【HCIA-Datacom】IPv4地址介绍
  • maven父子工程多模块如何管理统一的版本号?
  • JavaScript --函数的作用域(全局和局部)
  • 贪吃蛇项目实现(C语言)——附源码
  • 【C++】42道面试经典问题总结
  • php 实现JWT
  • vue table id一样的列合并
  • xshell密钥方式连接阿里云Linux
  • Wni11 下 WSL 安装 CentOS
  • ROADM(可重构光分插复用器)-介绍
  • HarmonyOS开发之路由跳转
  • 怎么使用ai 免费生成ppt?这4个工具可以帮忙
  • Android主副屏显示-Android13
  • 什么是 SMB 服务器以及它如何工作?
  • 【python计算机视觉编程——10.OpenCV】
  • 医学数据分析实训 项目二 数据预处理预备知识(数据标准化处理,数据离差标准化处理,数据二值化处理,独热编码处理,数据PCA降维处理)
  • MySQL查询执行(四):查一行也很慢
  • 【Obsidian】当笔记接入AI,Copilot插件推荐
  • Spring Cloud集成Gateaway
  • 如何准备技术面试?
  • Kafka原理剖析之「Topic创建」
  • Java 高级学习路线概要~
  • 浏览器插件快速开启/关闭IDM接管下载
  • 初识c++:入门基础
  • Java Exception 异常相关总结
  • HighCharts图表自动化简介