C# 为什么位转换器返回字节,那么我如何获取位?

C# 为什么位转换器返回字节,那么我如何获取位?,c#,bit-manipulation,bit-masks,C#,Bit Manipulation,Bit Masks,作为输入,我得到一个int(实际上是一个字符串,我应该转换成int)。 此整数应转换为位。 对于每个具有1的位位置,我应该得到该位置。 在我的数据库中,我希望所有具有int值字段的记录都将此位置作为值。 我目前有以下简单的代码,应该询问我的实体(持有databaseValue)是否匹配位置,但显然无法正常工作: Byte[] bits = BitConverter.GetBytes(theDatabaseValue); return bits[position].equals(1); 首先,我

作为输入,我得到一个int(实际上是一个字符串,我应该转换成int)。
此整数应转换为位。
对于每个具有1的位位置,我应该得到该位置。
在我的数据库中,我希望所有具有int值字段的记录都将此位置作为值。
我目前有以下简单的代码,应该询问我的实体(持有databaseValue)是否匹配位置,但显然无法正常工作:

Byte[] bits = BitConverter.GetBytes(theDatabaseValue);
return bits[position].equals(1);
首先,我有一个字节数组,因为显然没有位类型。我应该使用布尔[]吗? 那么,如何填充此数组? 最后,如果前面的语句已经解决,我应该只返回位[position]

我觉得这应该用位掩码来解决,但我不知道从哪里开始

任何帮助都将不胜感激

我想这就是你想要的。或者,自己使用位掩码并不难:

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

if((value&(1)不使用布尔值。尽管布尔值只有两个值,但它实际上是使用32位(如int)存储的


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

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

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

0110 1101 & 0010 0001 ----------- 0010 0001 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;
}
列出位位置(uint输入){
列表结果=新列表();
uint掩码=1;
int位置=0;
做{
如果(输入和掩码!=0){
结果。添加(位置);
}

我知道的掩码是&和|,但数组中没有的不是。如果有几个布尔字段,它们也不会(至少在默认情况下)打包在一起。不必说是单个位,但每个位只需要一个字节,而不是4个字节。如果你有一个布尔字段,然后是一个int字段,填充当然会起作用。是的,我就是这么想的。但我在这里有点茫然,所以什么都可以:P目前正在尝试1UP我的bitskills;)他,我又一次吸取了Jon的一些知识:P(基本上使用布尔值就内存使用而言等于使用字节)。但我仍然想知道为什么它被称为位转换器,而实际上它是一个字节转换器……这是一个好问题,但你可能可以想象“字节转换器”这个名称会引起另一种混乱。它不是真正转换字节,而是转换字节数组,它只是将字节用作原始位的方便表示形式。名称“ByteConverter”并不能真正让您了解该类的功能。