填充位表示与左右两个

时间:2012-10-05 06:10:06

标签: c padding bit

我尝试过使用谷歌搜索并阅读维基百科,但是他们都没有提到是否有一个命令来填充左/右的序列序列。例如,01000将成为010001111.我可以通过位屏蔽来完成此操作,但我的技术相当慢。那么在C中这样做的标准方法是什么?

3 个答案:

答案 0 :(得分:1)

要将值i填充为n 1位向右(最低有效位),您可以计算:

(i + 1 << n) - 1

答案 1 :(得分:1)

对于两者,我将x用于原始数字,n用于填充的位数。

正确(最不重要)填充:

我相信你可以逃脱的最少的行动是:

(x + 1 << n) - 1

我是怎么到那儿的?首先将x移到(x << n)上方。现在我们想要它,但填充0 s。我们可以使用1获得正确数量的(1 << n) - 1 s。现在,通常我们会按位 - 或者他们在一起。但是,由于其中一个1中的0与另一个(x << n) + (1 << n) - 1 = (x + 1 << n) - 1对齐,我们也可以添加它们,这样我们就可以简化:+。请注意- / <<>> / x | -1 << BIT_WIDTH - n 操作之前发生。

左(最重要的填充):

-1

首先,我们使用MAX_INT,因为它是全部的。我假设这是签名的;如果不是,请使用x1类型的相对常量。然后,只需将所有BIT_WIDTH - n移到1个广告位上,这样我们就会在正确的位置留下n x个广告位。在这里,我们应该按位或使用x,因为1可能会{{1}}位于应该填充的位置。另外,因为即使我们使用加法也无法简化它。

答案 2 :(得分:1)

#include <limits.h>
#include <assert.h>
#include <stdio.h>

unsigned pad(unsigned pattern, unsigned patternLen,
             unsigned leftBit, unsigned leftBitCnt,
             unsigned rightBit, unsigned rightBitCnt)
{
  unsigned r;
  assert(leftBitCnt < sizeof(unsigned) * CHAR_BIT);
  assert(rightBitCnt < sizeof(unsigned) * CHAR_BIT);
  assert(patternLen < sizeof(unsigned) * CHAR_BIT);
  assert(leftBitCnt + patternLen + rightBitCnt <= sizeof(unsigned) * CHAR_BIT);

  r = (leftBit << leftBitCnt) - leftBit;
  r <<= patternLen;
  r |= pattern;
  r <<= rightBitCnt;
  r |= (rightBit << rightBitCnt) - rightBit;

  return r;
}

void printBin(unsigned x)
{
  unsigned i;
  for (i = 0; i < sizeof(unsigned) * CHAR_BIT; i++)
    printf("%u", (x >> (sizeof(unsigned) * CHAR_BIT - 1 - i)) & 1);
  printf("\n");
}

int main(void)
{
  printBin(pad(0x0F0, 12, 0, 2, 0, 2));
  printBin(pad(0x0F0, 12, 0, 2, 1, 2));
  printBin(pad(0x0F0, 12, 1, 2, 0, 2));
  printBin(pad(0x0F0, 12, 1, 2, 1, 2));
  return 0;
}

输出(ideone):

00000000000000000000001111000000
00000000000000000000001111000011
00000000000000001100001111000000
00000000000000001100001111000011