【问题标题】:Why does the BitConverter return Bytes and how can I get the bits then?为什么 BitConverter 返回 Bytes 以及如何获取这些位?
【发布时间】:2008-12-17 15:40:50
【问题描述】:

作为输入,我得到一个 int(实际上,我应该将一个字符串转换为一个 int)。
此 int 应转换为位。
对于每个具有 1 的位位置,我应该得到该位置。
在我的数据库中,我想要所有具有 int 值字段的记录,该字段将此位置作为值。
我目前有以下幼稚的代码,它应该询问我的实体(持有 databaseValue)是否与位置匹配,但显然不能正常工作:

Byte[] bits = BitConverter.GetBytes(theDatabaseValue);
return bits[position].equals(1);

首先,我有一个字节数组,因为显然没有位类型。我应该使用 Boolean[] 吗? 那么,我该如何填充这个数组呢? 最后,如果前面的语句都解决了,我应该只返回 bits[position]

我觉得这应该以某种方式通过位掩码解决,但我不知道从哪里开始..

任何帮助将不胜感激

【问题讨论】:

    标签: c# bit-manipulation bit-masks


    【解决方案1】:

    你的感觉是对的。这应该用位掩码解决。 BitConverter 不返回位(它怎么可能?“位”不是实际的数据类型),它将原始字节转换为 CLR 数据类型。每当您想从某物中提取位时,您应该考虑位掩码。

    如果要检查是否设置了某个位置的位,请使用 & 运算符。仅当两个位都设置时,按位 & 才为真。例如,如果您有两个字节 109 和 33,则 & 的结果将是

    0110 1101 & 0010 0001 ------------ 0010 0001

    如果您只想查看是否在 int 中设置了某个位,您可以使用一个仅包含您要检查的位设置的数字(即 1、2、4、8、16、32 等) ) 并检查结果是否不为零。

    List<int> BitPositions(uint input) {
        List<int> result = new List<int>();
        uint mask = 1;
        int position = 0;
        do {
            if (input & mask != 0) {
                result.Add(position);
            }
            mask <<= 1;
            position++;
        } while (mask != 0);
    
        return result;
    }
    

    【讨论】:

    • 但我仍然想知道为什么它实际上是一个 ByteConverter...
    • 这是一个很好的问题,但您可以想象“ByteConverter”这个名字会引起另一种混乱。
    • 嗯,它真的不转换字节,它转换字节数组,并且它只是将字节用作原始位的方便表示。名称“ByteConverter”并不能真正让您了解该类的作用。
    【解决方案2】:

    我怀疑BitArray 是您所追求的。或者,自己使用位掩码并不难:

    for (int i=0; i < 32; i++)
    {
        if ((value & (1 << i)) != 0)
        {
            Console.WriteLine("Bit {0} was set!", i);
        }
    }
    

    【讨论】:

    • 我知道 & 和 |,但是
    【解决方案3】:

    不要使用布尔值。虽然 boolean 只有两个值,但它实际上像 int 一样使用 32 位存储。

    编辑:实际上,在数组形式中,布尔值将被打包成字节,而不是 4 个字节。

    【讨论】:

    • 不在数组中它不是。如果您有多个布尔字段,它们也会(至少默认情况下)打包在一起。诚然,不是单个位 - 但每个只需要一个字节,而不是 4 个。如果你有一个布尔字段,然后是一个 int 字段,那么填充当然会起作用。
    • 是的,我就是这么想的。但是我在这里有点在黑暗中徘徊,所以任何事情都会做:P 目前正在尝试提高我的比特技能;)
    • 他,我又一次吸取了乔恩的一些知识:P
    • (就内存使用而言,基本上使用布尔值相当于使用字节。)
    猜你喜欢
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2012-12-30
    相关资源
    最近更新 更多