我試過用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從左到右填充文本顏色