【问题标题】:circular shifting in c [closed]c中的循环移位[关闭]
【发布时间】:2011-08-23 14:15:50
【问题描述】:

我正在寻找实现循环移位到位二进制数左侧的算法 (c语言)。 该算法将像 >> 右侧的插槽将不填充零,而是填充从左侧移动的数字。

向右移动。

【问题讨论】:

标签: c


【解决方案1】:

这里的想法是将高 n 位(对于 n 位移位)和or 他们放在移位数字的右侧。

这应该给你一个开始。

【讨论】:

  • 虽然这是真的,但如何将前 n 位和/或它们放入右侧?
  • 是的,这很明显。这仍然没有告诉人们如何屏蔽这些位以及移动什么等。
  • @Rudy:你不需要 mask 任何东西。左移将从右侧推零。您使用按位 or 运算符添加最高(长度 - n)位。我不确定我是否理解您的问题。
  • 好吧,我想得太复杂了。但是,如果你将一个负 int 右移,它不会得到符号扩展,即它是否总是从右边移入零位,是否确定?
  • @Rudy:通常,当人们处理位操作时,他们将数字视为位向量,而不是数字,有符号或其他形式。只需确保您对这些操作使用无符号整数并避免担心。也就是说,如果您必须使用有符号数字,只需创建一个由 n 个 1 组成的掩码,然后将 and 放入右移高位。
【解决方案2】:
#define NUM_BITS_IN_INT ((sizeof(int) * 8)

int rotleft(int num, int shift)
{
    return (num << shift) | (num >> (NUM_BITS_IN_INT - shift));
}

int rotright(int num, int shift)
{
    return (num >> shift) | (num << (NUM_BITS_IN_INT - shift);
}

【讨论】:

  • 为什么不只是return (n&lt;&lt;1) | (n&lt;0);
  • @Stan:是的,这是可能的,但没有那么有指导意义。而且我总是保留将布尔值视为纯整数的保留。不过,相应地编辑了我的答案。
  • 感谢您的回答。负数会有问题
猜你喜欢
  • 1970-01-01
  • 2019-12-12
  • 2013-12-09
  • 1970-01-01
  • 2016-07-12
  • 2013-12-17
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
相关资源
最近更新 更多