在c#中通过位掩码存储多个值

2023-12-14

我试图通过位掩码将四个独立的 5 位值 (0-31) 存储在 32 位 int 内,但无法正确设置这些值,并从用于存储的掩码 int 中获取各个值。

谁能帮我这个?

Edit:

抱歉外部链接 - 这里有一些 JavaScript 演示了我想要实现的目标(但使用位掩码而不是十进制代数):

var s = 0;

var v = [31, 6, 23, 31];

//save values
s = v[0] + (v[1] * 32) + (v[2] * 1024) + (v[3] * 32768);

console.log(s);

//retrieve values
v[3] = parseInt(s / 32768);
v[2] = parseInt((s - (v[3] * 32768)) / 1024);
v[1] = parseInt((s - ((v[3] * 32768) + (v[2] * 1024))) / 32);
v[0] = parseInt(s - ((v[3] * 32768)+ (v[2] * 1024) + (v[1] * 32)));

console.log(v);

//modify values [1] and [2]
s = s - (v[1] * 32) + (9 * 32);
s = s - (v[2] * 1024) + (17 * 1024);

console.log(s);

//retrieve values
v[3] = parseInt(s / 32768);
v[2] = parseInt((s - (v[3] * 32768)) / 1024);
v[1] = parseInt((s - ((v[3] * 32768) + (v[2] * 1024))) / 32);
v[0] = parseInt(s - ((v[3] * 32768)+ (v[2] * 1024) + (v[1] * 32)));

console.log(v);

Output:

1039583
[31, 6, 23, 31]
1033535
[31, 9, 17, 31]

Edit:

感谢 Peter Duniho,我能够使用内置掩码来制作这些,以保存 32 位整数内的 6 个 5 位值的一些操作:

uint Get_5_In_32(uint storage, int index)
{
    switch (index)
    {
        case 0:
            return (storage & 0x0000001F);
        case 1:
            return (storage & 0x000003E0) >> 5;
        case 2:
            return (storage & 0x00007C00) >> 10;
        case 3:
            return (storage & 0x000F8000) >> 15;
        case 4:
            return (storage & 0x01F00000) >> 20;
        case 5:
            return (storage & 0x3E000000) >> 25;
        default:
            return (0);
    }
}
uint Set_5_In_32(uint storage, uint value, int index)
{
    if (value > 31) {  value = 31; }
    switch (index)
    {
        case 0:
            return (storage & 0xFFFFFFE0) | value;
        case 1:
            return (storage & 0xFFFFFC1F) | (value << 5);
        case 2:
            return (storage & 0xFFFF83FF) | (value << 10);
        case 3:
            return (storage & 0xFFF07FFF) | (value << 15);
        case 4:
            return (storage & 0xFE0FFFFF) | (value << 20);
        case 5:
            return (storage & 0xC1FFFFFF) | (value << 25);
        default:
            return (0);
    }
}

还有 Set 函数的 byref 版本,可以减少分配:

void Set_5_In_32(ref uint storage, uint value, int index)
{
    if (value > 31) {  value = 31; }
    switch (index)
    {
        case 0:
            storage &= 0xFFFFFFE0;
            storage |= value;
            break;
        case 1:
            storage &= 0xFFFFFC1F;
            storage |= (value << 5);
            break;
        case 2:
            storage &= 0xFFFF83FF;
            storage |= (value << 10);
            break;
        case 3:
            storage &= 0xFFF07FFF;
            storage |= (value << 15);
            break;
        case 4:
            storage &= 0xFE0FFFFF;
            storage |= (value << 20);
            break;
        case 5:
            storage &= 0xC1FFFFFF;
            storage |= (value << 25);
            break;
    }
}

没有更具体的问题,特别是您展示了迄今为止的代码并解释了您遇到的问题具体来说就让它发挥作用而言,很难确切地知道最好的答案是什么。

也就是说,这里有一些示例方法可能会为您指明正确的方向:

// Stores the given value in storage at the given index
int Set(int storage, int value, int index)
{
    int shiftCount = index * 5,
        mask = 0x1f << shiftCount;

    return (storage & ~mask) | (value << shiftCount);
}

// Retrieves the value stored in storage at the given index
int Get(int storage, int index)
{
    int shiftCount = index * 5,
        mask = 0x1f << shiftCount;

    return (storage & mask) >> shiftCount;
}

The Set()上面的方法获取当前值storage,清除要存储五位值的位范围内的所有位,然后使用|运算符来存储该五位值,首先将该值的位移到正确的位置。

The Get()方法执行相反的操作。它屏蔽(清除)所有位not在存储值的位范围内,然后将存储的位下移到一个最低有效的五位int在返回该结果之前。

Notes:

  • 以上是针对您所提到的问题的具体内容。通过封装在一个类中可以很容易地概括它,其中可以在初始化时配置位计数,并且掩码是基于该位计数生成的,而不是硬编码的。
  • 上面的代码没有进行错误检查。在生产代码版本中,最好验证value传递给Set()方法实际上适合五位(即小于0x20).

EDIT:

这是一个简单的控制台程序,使用示例数据演示了上述内容的用法:

static void Main(string[] args)
{
    int[] array = { 31, 6, 23, 31 };
    int storage = 0;

    storage = ArrayToStorage(array, storage);

    Console.WriteLine(storage);
    LogArray(array);

    storage = Set(storage, 9, 1);
    storage = Set(storage, 17, 2);

    StorageToArray(array, storage);

    Console.WriteLine(storage);
    LogArray(array);
}

static int ArrayToStorage(int[] array, int storage)
{
    for (int i = 0; i < array.Length; i++)
    {
        storage = Set(storage, array[i], i);
    }

    return storage;
}

static void StorageToArray(int[] array, int storage)
{
    for (int i = 0; i < array.Length; i++)
    {
        array[i] = Get(storage, i);
    }
}

static void LogArray(int[] array)
{
    Console.WriteLine("[" + string.Join(", ", array) + "]");
}

// Stores the given value in storage at the given index
static int Set(int storage, int value, int index)
{
    int shiftCount = index * 5,
        mask = 0x1f << shiftCount;

    return (storage & ~mask) | (value << shiftCount);
}

// Retrieves the value stored in storage at the given index
static int Get(int storage, int index)
{
    int shiftCount = index * 5,
        mask = 0x1f << shiftCount;

    return (storage & mask) >> shiftCount;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在c#中通过位掩码存储多个值 的相关文章

  • C# 创建函数队列

    我写了一个名为 QueueManager 的类 class QueueManager Queue functionsQueue public bool IsEmpty get if functionsQueue Count 0 return
  • 如何将十六进制字符串转换为十六进制数字[重复]

    这个问题在这里已经有答案了 可能的重复 如何将十六进制字符串转换为有符号整数 https stackoverflow com questions 3705429 how do i convert hex string into signed
  • 键盘加速器在 UWP 应用中停止工作

    我正在尝试将键盘加速器添加到 UWP 应用程序中的 CommandBar 菜单项 当应用程序启动时 这工作正常 但在我第一次打开溢出菜单后 加速器停止工作 这似乎不会发生在主要命令 菜单之外 上 只有溢出菜单内的辅助命令才会发生 此外 单击
  • 静态类变量与外部变量相同,只是具有类作用域吗?

    在我看来 静态类变量与外部变量相同 因为你只需要declare它在static int x extern int x语句 并在其他地方实际定义它 通常在 cpp 文件中 静态类变量 h file class Foo static int x
  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • 是否有像 gccxml 这样的用于生成包装器的 C 标头解析器工具?

    我需要为一种新的编程语言编写一些 C 标头包装器 并且想要类似 gccxml 的东西 但不完全依赖 gcc 以及它在 Windows 系统上带来的问题 只需要读C而不是C 只要有完整的文档记录 任何格式的输出都可以 Linux Solari
  • 操纵 setter 以避免 null

    通常我们有 public string code get set 如果最终有人将代码设置为 null 我需要避免空引用异常 我尝试这个想法 有什么帮助吗 public string code get set if code null cod
  • 格式化货币

    在下面的示例中 逗号是小数点分隔符 我有这个 125456 89 我想要这个 125 456 89 其他示例 23456789 89 gt 23 456 789 89 Thanks 看看这个例子 double value 12345 678
  • 以编程方式更新 ClickOnce 应用程序的部署清单会导致缺少 4.0 中所需的 <兼容框架> 元素

    我正在致力于自动化 NET 4 0 ClickOnce WPF 应用程序的安装程序 该应用程序需要在应用程序配置文件 我经历了寻找必须遵循的具体步骤的棘手过程Mage exe http msdn microsoft com en us li
  • 系统错误 124 - SHFileOperation 的 ERROR_INVALID_LEVEL

    我在使用时遇到问题SHFileOperation SHFileOperation SHFILEOPSTRUCT https stackoverflow com questions 9191415 shfileoperation shfile
  • 错误左值需要作为赋值C++的左操作数

    整个程序基本上只允许用户移动光标 如果用户位于给定的坐标范围 2 2 内 则允许用户键入输入 我刚刚提供了一些我认为足以解决问题的代码 我不知道是什么导致了这个问题 你能解释一下为什么会发生吗 void goToXY int int 创建一
  • .NET JIT 编译的代码缓存在哪里?

    NET 程序首先被编译为 MSIL 代码 当它被执行时 JIT编译器会将其编译为本机机器代码 我想知道 这些JIT编译的机器代码存储在哪里 它只存储在进程的地址空间中吗 但由于程序的第二次启动比第一次快得多 我认为即使在执行完成后 该本机代
  • 使用(linq to sql)更新错误

    我有两个表 通过外键 CarrierID 绑定 Carrier CarrierID CarrierName CarrierID 1 CarrierName DHL CarrierID 2 CarrierName Fedex Vendor V
  • 如何使用收益返回和递归获得字母的每个组合?

    我有几个像这样的字符串列表 可能有几十个列表 1 A B C 2 1 2 3 3 D E F 这三个仅作为示例 用户可以从几十个具有不同数量元素的类似列表中进行选择 再举个例子 这对于用户来说也是一个完全有效的选择 25 empty 4 1
  • TPL 数据流块下游如何获取源生成的数据?

    我正在使用 TPL Dataflow 处理图像 我收到处理请求 从流中读取图像 应用多次转换 然后将生成的图像写入另一个流 Request gt Stream gt Image gt Image gt Stream 为此 我使用块 Buff
  • ASP.NET Core Razor Page 多路径路由

    我正在使用 ASP NET Core 2 0 Razor Pages 不是 MVC 构建系统 但在为页面添加多个路由时遇到问题 例如 所有页面都应该能够通过 abc com language 访问segment shop mypage 或
  • 如何将对象转换为传递给函数的类型?

    这不会编译 但我想做的只是将对象转换为传递给函数的 t public void My Func Object input Type t t object ab TypeDescriptor GetConverter t ConvertFro
  • 使用 Chrome 和 Selenium 设置 LocalStorage

    我正在尝试使用 OpenQA Selenium 和 Chrome 设置本地存储键和值 我认为这相当微不足道 但我似乎无法让它发挥作用 我对 C 很陌生 所以我可能错过了一些东西 无论如何 我有这个功能 public static void
  • c# 模拟 IFormFile CopyToAsync() 方法

    我正在对一个异步函数进行单元测试 该函数将 IFormFile 列表转换为我自己的任意数据库文件类列表 将文件数据转换为字节数组的方法是 internal async Task

随机推荐

  • 请求无法从网页获取文本?

    我正在尝试从网页获取 VIX 的值 我正在使用的代码 raw page requests get https www nseindia com live market dynaContent live watch vix home page
  • 来自 R/Rgui 的 `system()` 交互式 .exe/二进制文件

    我想使用运行交互式二进制文件system R 内 通过交互 假设我想从 R 中运行 python 命令行解释器 谁知道为什么 但无论如何 当我从命令行 即 Rterm 运行 R 时 我可以像这样启动 python 解释器 gt system
  • CLR UDF 返回 Varbinary(MAX)

    SQL CLR 用户定义函数是否可以返回数据类型 varbinary MAX 在文档中它提到 标量值函数返回的输入参数和类型可以是 SQL Server 支持的任何标量数据类型 除了 rowversion text ntext image
  • python 中列表推导式的计算方式以及计算顺序

    我有两个列表理解 其中条件在不同的地方定义 gt gt gt x 2 if x 2 0 else x 3 if x 3 0 else 0 for x in range 10 0 0 4 27 16 0 36 0 64 729 gt gt g
  • 如何在 bash 中创建仅包含十六进制字符而没有空格的文件的十六进制转储?

    我如何创建一个未修改的Linux 中使用 bash 的二进制文件的十六进制转储 这od and hexdump命令都在转储中插入空格 这并不理想 有没有一种方法可以简单地在输出中编写一个包含所有十六进制字符 减去空格或换行符的长字符串 xx
  • 为什么我的字符串开头有“未定义”文本?

    我有一个函数可以将 AJAX 请求的结果连接在一起 由于某种原因 我的最终字符串以 未定义 开头 这是重现该问题的简化示例 In practice fetched via AJAX from a server var vendors id
  • ASP.NET MVC 本地化

    我正在尝试通过路线实现本地化 我有以下内容 routes MapRoute DefaultLocalized lang controller action id new controller Home action Index id lan
  • 使用 mysql 中的递归 php 创建数组

    我需要从像这样组织的 mysql 数据库创建一个数组 id description parentId 1 Level 1 0 2 Level 2 0 3 Level 1a 1 4 Level 1b 1 5 Level 1a1 3 6 Lev
  • jQuery 动画背景位置在块中?

    我正在尝试使用 jQuery 使跨度的背景位置每秒下降 10 像素 有什么好的方法可以做到这一点 我一直在玩 jQuery animate delay CSS 等setTimeout功能 但我无法让任何东西工作 非常感谢建议 我试图使 y
  • gitlab-shell:不允许的命令

    我已经在 Ubuntu 14 04 上安装了最新版本的 GitLab 除了推送到远程之外它工作正常 Running ssh email protected git receive pack repo git 效果很好 在 gitlab sh
  • ASP.NET MVC5 占位符中的字体很棒

    我正在尝试向登录页面的占位符添加一个字体很棒的图标 这是我到目前为止所拥有的 我不知道如何获得字体很棒的图标inside文本框 作为占位符 Html TextBoxFor m gt m UserName new class form con
  • XElement.Load 读取 & 符号和特殊国家/地区字符时出错

    我在从 XML 文件读取 符号时遇到问题 XElement xmlElements XElement Load Path Xml Data File 当我有以下情况时 我会收到错误
  • 在下拉列表打开时更改其内容?

    我有一个包含一些项目的下拉列表 当用户选择其中之一时 我希望下拉列表保持打开状态并重新填充新项目 然后用户选择其中之一 最后下拉菜单关闭 可以用 JavaScript 完成吗 如果是这样 怎么办 为了科学 我创建了一个替代答案来测试这一点
  • 如何在xmppGroupCoreDataStorageObject中保存和获取?

    Using xmpp messenger ios 我已经创建了组并设置了其配置并将用户添加到其中 然后我想将该组添加到xmppGroupCoreDataStorageObject存储以将其列出到 OpenChatViewController
  • UITextField 边框颜色

    我非常希望将自己的颜色设置为 UITextField 边框 但到目前为止我只能找到如何更改边框线样式 我使用背景属性以这种方式设置背景颜色 self textField backgroundColor textFieldColor 但我也必
  • pip/python:普通站点包不可写

    我有一台新 Macbook 一个用户安装了它 然后我安装了一个新用户 我的 授予管理员权限并删除了旧用户 我在 Catalina 操作系统上 自从安装以来 我一直遇到一些权限问题 VSCode 找不到 Jupyter Notebook pi
  • 获取 Google Cloud Storage 中的文件列表 (Appengine PHP)

    我有一个 Google Cloud Storage 存储桶 MyBucket 它有 20 个项目 我想在我的 appengine PHP 应用程序中获取这些文件名 我正在考虑是否可以使用 App Engine 的内置 Google Clou
  • 正则表达式帮助 - python - 从 css 中提取所有图像 url

    我正在尝试从 css 文件中提取所有图像 jpg png gif uri 示例 CSS blockpricecont width 660px height 75px background url images postBack jpg re
  • 使用画布nodeJS模糊图像

    这好像是ctx filter blur amount 不起作用 这是我的代码 const body await request get url const data await Canvas loadImage body ctx filte
  • 在c#中通过位掩码存储多个值

    我试图通过位掩码将四个独立的 5 位值 0 31 存储在 32 位 int 内 但无法正确设置这些值 并从用于存储的掩码 int 中获取各个值 谁能帮我这个 Edit 抱歉外部链接 这里有一些 JavaScript 演示了我想要实现的目标