为什么 BitConverter 返回字节以及如何获取这些位?
作为输入,我得到一个 int (好吧,实际上是一个我应该转换为 int 的字符串)。
该 int 应转换为位。
对于每个有 1 的位位置,我应该得到该位置。
在我的数据库中,我希望所有具有 int 值字段的记录都将此位置作为值。
我目前有以下简单的代码,应该询问我的实体(保存数据库值)是否与位置匹配,但显然无法正常工作:
Byte[] bits = BitConverter.GetBytes(theDatabaseValue);
return bits[position].equals(1);
首先,我有一个字节数组,因为显然没有位类型。 我应该使用布尔[]吗? 那么,如何填充这个数组呢? 最后,如果前面的语句得到解决,我应该只返回位[位置]
我觉得这应该以某种方式用位掩码解决,但我不知道从哪里开始..
任何帮助将不胜感激
As input I get an int (well, actually a string I should convert to an int).
This int should be converted to bits.
For each bit position that has a 1, I should get the position.
In my database, I want all records that have an int value field that has this position as value.
I currently have the following naive code that should ask my entity(holding the databaseValue) if it matches the position, but obviously doesn't work correctly:
Byte[] bits = BitConverter.GetBytes(theDatabaseValue);
return bits[position].equals(1);
Firstly, I have an array of byte because there apparantly is no bit type. Should I use Boolean[] ?
Then, how can I fill this array?
Lastly, if previous statements are solved, I should just return bits[position]
I feel like this should somehow be solved with bitmasks, but I don't know where to start..
Any help would be appreciated
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你的感觉是正确的。 这应该用位掩码来解决。 BitConverter 不返回位(怎么可能?“位”不是实际的数据类型),它将原始字节转换为 CLR 数据类型。 每当你想从某些东西中提取位时,你应该考虑位掩码。
如果您想检查某个位置的某个位是否已设置,请使用 & 操作员。 按位与 仅当两个位均设置时才为真。 例如,如果您有两个字节 109 和 33,则 & 的结果为: 那么
如果您只想查看 int 中是否设置了某个位, 您 & 它与一个仅包含您要检查的位(即 1、2、4、8、16、32 等)的数字,并检查结果是否不为零。
Your feeling is correct. This should be solved with bitmasks. BitConverter does not return bits (and how could it? "bits" isn't an actual data type), it converts raw bytes to CLR data types. Whenever you want to extract the bits out of something, you should think bitmasks.
If you want to check if a bit at a certain position is set, use the & operator. Bitwise & is only true if both bits are set. For example if you had two bytes 109 and 33, the result of & would be
If you just want to see if a bit is set in an int, you & it with a number that has only the bit you're checking set (ie 1, 2, 4, 8, 16, 32 and so forth) and check if the result is not zero.
我怀疑 BitArray 就是您想要的。 或者,自己使用位掩码并不难:
I suspect BitArray is what you're after. Alternatively, using bitmasks yourself isn't hard:
不要使用布尔值。 虽然boolean只有两个值,但它实际上和int一样使用32位存储。
编辑:实际上,以数组形式布尔值将被打包成字节,而不是 4 个字节。
Do not use Boolean. Although boolean has only two values, it is actually stored using 32 bits like an int.
EDIT: Actually, in array form Booleans will be packed into bytes, not 4 bytes.