gpt4 book ai didi

c# - 区分整数的位

转载 作者:太空宇宙 更新时间:2023-11-03 12:46:46 25 4
gpt4 key购买 nike

我有一个32位整数,通过将各个位映射到各种类型的数据来填充数据。

例如,一部分用于氧气水平。这是一个0到128之间的值,因此我使用7位。

另一部分用于旋转对象。围绕三个轴x,y和z的旋转始终为0、90、180或270度。每个角度的索引值为0、1、2和3,因此我只需要6位。旋转存储为010101,以围绕x,y和z旋转90度;旋转存储为100000,以围绕x,y和z旋转180度。

有些部分存储为整数值,例如含氧量,但是在需要使用它们时将其转换为枚举。

每个部分在数据整数中彼此相邻布置,从右到左填充位。

Type :    ... | Oxygen  | Rotation |
--------------------------
Bits: ... | 0000000 | 000000 |
--------------------------
Position: ... | 19-25 | 26-31 |
--------------------------


问题

我想比较两个整数,看看有什么变化。

当一个int的氧含量为16,另一个int的氧含量为20时,相差增加了4个单位。当一个旋转在所有轴上均为0,而另一旋转在x上为90,则差为绕x的旋转为90度。

我在数据对象上有扩展方法,该方法使我可以将氧含量作为一个整数值,并将旋转数作为一个四元数。当在增量数据对象上使用这些元素时,我想获得氧气水平的值4,以及围绕x旋转90度的四元数。



获得两个整数的差值的最有效方法是什么?

可能的方法

我考虑过几种不同的方法来解决这个问题。

整数比较

由于数据是整数,因此我尝试简单地从另一个中减去一个。我从一个值为0的int开始,将氧气水平的位设置为16。我创建了一个新的int,将其氧气水平设置为20,然后从最后一个值中减去第一个,并且增量的氧气水平为4但是,当我将旋转和其他数据添加到整数时,减法后的结果改变了产生的氧气水平和旋转。

我需要确认我所有的扩展方法都按预期工作。所有单元测试都成功,但是测试可能还不够好。

按位比较

另一种方法是使用各种按位运算符分别比较整个整数中的每个位。我使用了一个int,旋转位设置为围绕x(位01)的90度。另一个int的x旋转设置为180度(位10)。我正在寻找的增量值是90度(位01),但是我找不到任何合适的运算符来产生该结果。

该测试使我相信我无法单独比较位。对于旋转索引,我需要将一对位视为单个值。

位数组

我阅读了.net的BitArray的文档,但无法立即看到使用该文档会有所不同。

比较每个部分

比较每个位部分将产生我想要的结果。在计算差值之前,将旋转位转换为四元数,然后在将其设置为数据整数之前将其转换回四元数。

这是我希望找到的替代方法。我不想让比较器知道数据的结构,而是希望找到一个更有效的解决方案。

编辑

在阅读注释并进行了更多测试之后,我现在看到仅对位部分的新值而不对它们进行了多少更改将对我的案例更为有益。任何保持不变的部分都应归零。据我所知,我唯一的选择是按段比较数据。

重新编辑

我不确定选择哪个答案是正确的答案。我认为我的问题不够具体,对此我感到抱歉。

@harold给出的方法在逐位比较时有效,并且与数据结构无关。

@Pikoh的答案逐节进行比较,可以将其动态化,从而使该方法无需了解数据结构。

最佳答案

我不确定您想要什么,但是使用典型的SWAR techniques可以计算所有字段的模数差:

z = ((x | H) - (y &~H)) ^ ((x ^~y) & H)


这是SWAP减法的通用公式。对于2位字段, H = 0xAAAAAAAA

由于只有两位,SWAR通常对高位进行不同的处理(以防止泄漏到下一个字段中),因此这些位实际上是完全分开的。



有了新的要求,也不必对字段进行难看的拆分,例如:(未测试)

m = x ^ y;
m = (m | (m >> 1)) & 0x55555555;
m *= 3;
z = y & m; // maybe


这里的想法是,如果异或已更改,那么异或将在字段的某处产生1,然后对该字段的所有位进行“或”运算,并将其放在该字段的最低位,乘以3会将其广播到该字段的所有位。 &用新值获取更改的字段,并在其他位置将其设为零,但这意味着您无法区分“更改为0”和“未更改”。使用 m您仍然可以区分它们。

关于c# - 区分整数的位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37022521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com