【发布时间】:2010-11-10 05:17:29
【问题描述】:
对不起这个笨拙的标题;我找不到一点表达我想做的事情的方式。
我从多个 32 位整数的用户那里得到一个输入。例如,用户可以输入以下值(为了便于说明,以十六进制显示):
0x00001234
0x00005678
0x0000abcd
在这种特殊情况下,每个输入的前 2 个字节是常量,而后 2 个字节是可变的。为了提高效率,我可以将0x0000 存储为单个常量,并创建一个包含uint16_t 值的向量来存储输入的变量部分(0x1234、0x5678、0xabcd)。
现在假设用户输入以下内容:
0x00000234
0x56780000
0x00001000
在这种情况下,我需要一个包含uint32_t 值的向量来存储输入的可变部分,因为每个值都会影响不同的字节。
我目前的想法是做以下事情:
uint32_t myVal = 0;
myVal |= input1;
myVal |= input2;
// ...
然后在最后找到myVal 中第一个和最后一个“切换”(即1)位之间的距离。该距离将为我提供所有输入的可变部分所需的字段大小。
但是,这听起来不太适合大量用户输入。关于确定这一点的优雅而有效的方法有什么建议吗?
更新:
我在上面的解释中简化了问题。
需要说明的是,我这样做并不是为了节省内存(我有比尝试节省几个字节更好的事情要做,这不是为了优化目的)。
总之,组件 A 在我的系统中为组件 B 提供了值。有时这些值是 128 位的,但组件 B 只支持 32 位的值。
如果128位值的可变部分可以用32位值表示,我可以接受。否则我将需要以错误方式拒绝它。
我无法修改组件 B 以允许 128 位值,或修改组件 A 以阻止其使用 128 位值(这里也有硬件限制)。
【问题讨论】:
-
你为什么觉得有必要这样做?
-
@GMan - 我在解释中简化了问题。总之,组件 A 为我系统中的组件 B 提供了值。有时这些值为 128 位,但组件 B 仅支持 32 位值。如果 128 位值的可变部分可以用 32 位值表示,我可以接受。否则我将需要以错误方式拒绝它。我无法修改组件 B 以允许 128 位值,或修改组件 A 以阻止其使用 128 位值(这里也有硬件限制)。
-
@Leopard:所以你应该把它作为你的问题发布,因为这实际上是你面临的问题。提出理论问题只会得到一般的理论答案。 Ask real questions for real answers.
-
@GMan - 很抱歉,我试图将问题分解为我要解决的基本要素。我不认为这会影响人们给出的答案,但不认为人们会质疑我的动机。
-
组件 B 如何找到每个 128 位值的开始和结束?是否以文本形式传递?
标签: c++ bit-manipulation