如何从字节中获取子位作为单独的整数值?

Posted

技术标签:

【中文标题】如何从字节中获取子位作为单独的整数值?【英文标题】:How to get subbits from byte as separate integer value? 【发布时间】:2016-08-21 18:31:12 【问题描述】:

例如,我有 byte = 245。我想从中获取任意数量的子位并将其转换为整数。我怎么能做到这一点? 例如,我需要 2 到 5 位或 0 到 2、5 到 7 的值。

任何基于 C 语言的解决方案都可以。

目前我使用这个函数来获取单个位:

public bool GetBitFromByte(byte b, byte bit_index_0_7)

    var bit = (b & (1 << bit_index_0_7)) != 0;

    return bit;

通过这个函数,我收集 bools 数组并将其传递给这个垃圾函数:

public static byte[] GetBytesFromBits(bool[] bits)

    int bits_amount = bits.Length;

    while (bits_amount % 8 > 0)
        bits_amount++;

    byte[] vals = new byte[bits_amount / 8];

    for (int i = 0; i < bits.Length; i += 8)
    
        byte val = 0;

        for (int j = i; j < i + 8 && j < bits.Length; j++)
        
            val <<= 1;
            if (bits[j]) val |= 1;
        

        vals[i / 8] = val;
    

    return vals;

Thins 函数逻辑很奇怪,我正在寻找更清晰和原生的方式。

【问题讨论】:

您尝试了哪些方法,为什么不起作用?请举例说明输入、预期输出和实际输出。 @WeatherVane - 我发布了我目前拥有的内容。我正在寻找一种没有垃圾代码的更简单的方法。 抱歉,这不是 C 题。我很惊讶您代表的成员提出了如此微弱的问题和垃圾邮件标签。 在 C 中有效的内容也将在 C# 中有效。我需要任何解决方案。我什至可以在 C 上制作 DLL 并在 C# 下加载它。 它在 C 中不起作用。它不是 C 代码。 【参考方案1】:

这称为掩蔽。您将位指定为 2 的幂(例如,在 C++ 中,1&lt;&lt;i 表示位 i),将它们相加以形成掩码,然后在原始值和掩码上使用 &amp;

【讨论】:

谢谢。会努力去做的。 例如:int result = input &amp; ((1&lt;&lt;5) + (1&lt;&lt;4) + (1&lt;&lt;3) + (1&lt;&lt;2))

以上是关于如何从字节中获取子位作为单独的整数值?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 如何从 varchar 列中获取精确的整数值

tinyintsmallintbigintint 区别

从一个字节中获取 n 位

MySQL常用数据类型

VB.NET的整型数据类型

如何从 javafx imageView 获取字节 []?