将 Nibbles 推入 C 中的整数堆栈

Posted

技术标签:

【中文标题】将 Nibbles 推入 C 中的整数堆栈【英文标题】:Pushing Nibbles onto an integer stack in C 【发布时间】:2013-02-27 18:25:49 【问题描述】:

我有一个无符号整数,我想将半字节推入其中。例如,如果我有值为1, 2, 3, 4, 5, 6, 7 & 8 的半字节,我希望能够将第一个半字节推入我的整数中:

0x10000000 (268435456)

第二次推送后,我会有:

0x12000000 (301989888)

第三次推送后,我会有:

0x12300000 (305135616)

等等。有没有人对我如何实现这一目标有一个巧妙而巧妙的想法?解决方案需要能够以任意数字作为起点,并推到第一个可用的零。因此,提供 int 301989888 作为起点并推动 3 将导致 305135616。从MSBLSB 推送也会很有用。

我很抱歉。听起来像是考试题。不是——我只是想尝试一个实验,还没开始就卡住了!


勾选的答案是完美的!我稍微修改了一下(只是为了让它独立),我很高兴!

#define left 0
#define right 1

void push(unsigned* number, int nibble,int direction)
  int i, shift;
  if (direction)
    for (i = 28; i >= 0; i -= 4)
  if (!(*number & (0xfU << i)))
    shift = i;

  
  else
for (i = 0; i <= 28; i += 4)
  if (!(*number & (0xfU << i)))
    shift = i;

  
  *number|=nibble<<shift;

调用如下: 推(&x,nibble,left);

我为格式化道歉。

【问题讨论】:

你的意思是从301989888开始,然后推3,对吧? 完全正确。你认为我可以把它当作一个故意的错误,只是为了看看有没有人注意吗?谢谢你这么有眼光。 【参考方案1】:

您需要做两件事 - 检测下一个 nibble 的位置,然后将其放在那里。对于检测,您可以屏蔽和移位:

int nextLocation(uint32_t x)

   int i;
   for (i = 28; i >= 0; i -= 4)
   
       if (!(x & (0xfU << i)))
           return i;
   
   return -1;

此函数将返回“推动”下一个半字节所需的升档量(如果整数已满,则返回 -1)。

然后,你需要输入新的值(假设x是你要压入的值,nibble是你要压入的值):

int shiftAmount = nextLocation(x);
x |= nibble << shiftAmount;

要推动另一个方向,您可以在nextLocation 函数中更改for 循环的方向:

for (i = 0; i <= 28; i += 4)

【讨论】:

谢谢 - 我非常感谢你。事实上,你让我很开心!【参考方案2】:

这是一个非常简单的示例,它可以满足您的需求。它“推动”,但不是以自动化的方式(如果那是您正在寻找的)。但这证明了这个概念(注意:我将每个半字节组合成一个字节)。

#include <iostream>

using namespace std;

int main()

    int x = (0x12 << 24) | (0x34 << 16) | (0x56 << 8) | (0x78);
    cout<< hex << x << endl;
    return 0;

【讨论】:

感谢您的建议。我已经可以做那部分了 - 我需要加倍努力 - 正如 Carl 提供的那样

以上是关于将 Nibbles 推入 C 中的整数堆栈的主要内容,如果未能解决你的问题,请参考以下文章

将XMM寄存器推入堆栈

JNI,C ++将字符串推入堆栈

最大频率栈

最大频率栈

将 xmm 寄存器推入堆栈时出错

C - 堆栈分配的链表