[英]How to swap first and last nibbles in given integer [32 bits]
認為:
No = 77
77 in binary [32 bits] : 0000 0000 0000 0000 0000 0000 0100 1101
我必須交換第一個和最后一個半字節:
i.e : 1101 0000 0000 0000 0000 0000 0100 0000
我正在做這樣的事情:
no << 32 | no >> 32
然后循環並用 1 和打印。 但這行不通。
#include<stdio.h>
int main()
{
int decimalNumber;
printf("Enter your decimal number: ");
scanf("%d", &decimalNumber);
int i, j;
/* Binary conversion */
for(i=31;i>=0;i--)
{
printf("%d", (decimalNumber >> i) & 1);
}
printf("\n");
printf("After nibble swapping: \n");
/* Nibble swapping */
decimalNumber = (decimalNumber>>28) | (decimalNumber<<28);
for(i=31;i>=0;i--)
{
printf("%d",((decimalNumber>>i)&1 ? 1 : 0));
}
printf("\n");
return 0;
}
給定一個無符號的 integer d
和b
位數,其中b <= CHAR_BIT * sizeof(d) / 2
您可以通過這些組件的按位OR
運算獲得結果:
將較低的b
位左移到頂部( sizeof (d) - (b)
在這種情況下為28
位)。 當您左移時,低位變為 0。對於示例數據,該值為0x8000000
。
左移后右移清除高b
位,右移后左移清除低b
位。 對於示例數據,值為0x02345670
。 這等效於 32 位數字的掩碼0x0ffffff0
的按位AND
。 該班次適用於任何無符號 integer 類型,無論其大小如何。
將高位b
位右移到低位。 當您右移時,高位b
位變為零。 對於示例數據,值為0x00000001
。
#include <limits.h>
#include <stdio.h>
#include <stdint.h>
#define SWAP_BITS(d, b) \
/* 1 */ (d) << CHAR_BIT * sizeof (d) - (b) |\
/* 2 */ (d) << (b) >> (b) >> (b) << (b) |\
/* 3 */ (d) >> CHAR_BIT * sizeof (d) - (b)
int main() {
uint32_t d = 0x12345678;
printf("%x\n%x\n", d, SWAP_BITS(d, 4));
}
結果是:
82345671
交換給定 integer(32 位)中的第一個和最后一個半字節
OP 的decimalNumber = (decimalNumber>>28) | (decimalNumber<<28);
decimalNumber = (decimalNumber>>28) | (decimalNumber<<28);
失敗為|
或者是數據,而不是替換它。 同樣移動 28 位會移動需要保留在原位的中間位。
使用無符號類型不移入或移出符號位。
對於固定大小的任務,請考慮使用#include <stdint.h>
中的固定大小類型。
使用 %X 打印數據以更好地查看發生了什么。
uint32_t uvalue = decimalNumber;
printf("Before %lu\n", (unsigned long) uvalue); // In decimal
printf("Before 0x%lX\n", (unsigned long) uvalue); // In hexadecimal
// Get first (most significant) and last (least significant) nibble.
uint32_t first_nibble = uvalue >> (32-4);
uint32_t last_nibble = uvalue & 0xF;
// zero out the first and last nibble.
uvalue &= 0x0FFFFFF0;
// Now "or" in the replacement nibbles.
uvalue |= first_nibble;
uvalue |= last_nibble << (32-4);
printf("After 0x%lX\n", (unsigned long) uvalue);
printf("After %lu\n", (unsigned long) uvalue);
對於那些喜歡單線的人
printf("After %lu\n", (unsigned long) (
(((uint32_t) decimalNumber) & 0xF) << 28) |
((uint32_t) decimalNumber) & 0x0FFFFFF0) |
((uint32_t) decimalNumber) >> 28) |
));
有些人會認為第一個半字節是最不重要的半字節。 無論是第一個還是最后一個都沒有什么區別,因為它們被交換了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.