我试过用Google搜索并阅读维基百科,但是他们中没有人提到是否有命令在左/右上填充一个位序列。例如,01000会变成010001111.我可以通过位掩码来做到这一点,但我的技术很慢。那么在C中做这件事的标准方式是什么?左右填充位表示法
Q
左右填充位表示法
1
A
回答
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
1
要填充值i
与n
1位权(至少显著位),你可以计算出:
(i + 1 << n) - 1
1
对于这两个,我会用x
为原来的号码和n
的位数垫。
右(最低显著)填充:
我相信最少的操作,您可以逃脱是:
(x + 1 << n) - 1
我怎么到那里?从x
开始(x << n
)。现在它在我们想要的位置,但填充了0
s。我们可以通过(1 << n) - 1
获得1
的正确数量。现在,我们通常会按位或将它们放在一起。但是,由于其中一个中的所有1
与另一个中的0
对齐,所以我们也可以添加它们,这使我们简化了:。请记住,+
/-
发生在<<
/>>
操作之前。
左(最显著填充):
x | -1 << BIT_WIDTH - n
首先,我们使用-1
因为它是所有的人。我假设这是签署的;如果不是,则使用MAX_INT
或x
类型的相对常数。然后,简单地将所有1
转移到BIT_WIDTH - n
槽位,这使我们在正确的位置留下了n 1
s。在这里,我们应该按位或x
,因为x
可能有1
s应该填充的位置。另外,即使使用加法,我们也不能简化它。
相关问题
- 1. LinearLayout从右到左填充
- 2. 删除TabLayout左右填充
- 3. 从左到右填充Div
- 4. Button.setCompoundDrawablesWithIntrinsicBounds()的左/右填充?
- 5. 动画文字填充从左到右
- 6. 设置mx:MenuBar左右填充为零
- 7. 左右填充不起作用
- 8. Android,意外的按钮左右填充
- 9. 删除Bootstrap WELL填充左右
- 10. 填充右侧和左侧边框
- 11. 如何设置左右填充到xamarin.forms
- 12. 从左到右动画SVG填充
- 13. 填充左,右使用核心JavaScript
- 14. WPF中的填充(左,上,右,下)
- 15. 填充左侧正在工作,但填充右侧不是
- 16. 右填充或零填充左对齐的字符串
- 17. CSS定位填充容器:宽度与左/右?
- 18. CSS填充右
- 19. 从右到左填充评级栏星星从右到左xml布局
- 20. 填充从右到左的宽度而不是默认的从左到右
- 21. 变更左填充行右边填补行
- 22. “按位与”和左填充在C++
- 23. android布局不填充屏幕留下填充左边和右边
- 24. 使列具有填充右侧和填充左侧0以及引导
- 25. 按位操作 - 零填充右移(>>>)用法?
- 26. 从列表中删除左填充(CSS)
- 27. 填充BigInteger的二进制表示法
- 28. 当在表格中RTL和LTR之间的方向改变时,填充右键或填充左键问题
- 29. 从底部和从右到左的顺序填充内容
- 30. 使用CSS从左到右填充文本颜色