作为输入,我得到一个int(好吧,实际上是一个我应该转换为int的字符串) 这个int应该转换为位 对于每个具有1的位位置,我应该得到位置 在我的数据库中,我希望所有具有int值字段的记录都具有此位置作为值 我目前有以下天真的代码,如果它与位置匹配,应该询问我的实体(持有databaseValue),但显然无法正常工作:
Byte[] bits = BitConverter.GetBytes(theDatabaseValue);
return bits[position].equals(1);
首先,我有一个字节数组,因为它显然没有位类型。我应该使用Boolean []吗? 然后,我该如何填充这个数组呢? 最后,如果先前的语句被解决,我应该只返回位[位置]
我觉得这应该以某种方式用位掩码解决,但我不知道从哪里开始..
任何帮助将不胜感激
答案 0 :(得分:4)
我怀疑BitArray就是你所追求的。或者,自己使用位掩码并不难:
for (int i=0; i < 32; i++)
{
if ((value & (1 << i)) != 0)
{
Console.WriteLine("Bit {0} was set!", i);
}
}
答案 1 :(得分:4)
你的感觉是正确的。这应该用位掩码解决。 BitConverter不返回位(它怎么可能?“位”不是实际数据类型),它将原始字节转换为CLR数据类型。无论什么时候你想从某些东西中提取出来的东西,你都应该考虑使用bitmasks。
如果要检查某个位置是否设置了某个位置,请使用&amp;运营商。按位&amp;仅当两个位都置位时才为真。例如,如果您有两个字节109和33,则结果为&amp;会是
0110 1101 & 0010 0001 ----------- 0010 0001
如果你只是想看看是否在int中设置了一个位,你和&amp;它的数字只有你正在检查的位(即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;
}
答案 2 :(得分:1)
不要使用布尔值。虽然boolean只有两个值,但它实际上是使用32位存储的,如int。
编辑:实际上,在数组形式中,布尔值将打包成字节,而不是4个字节。