簡體   English   中英

如何交換給定 integer [32 位] 中的第一個和最后一個半字節

[英]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 db位數,其中b <= CHAR_BIT * sizeof(d) / 2您可以通過這些組件的按位OR運算獲得結果:

  1. 將較低的b位左移到頂部( sizeof (d) - (b)在這種情況下為28位)。 當您左移時,低位變為 0。對於示例數據,該值為0x8000000

  2. 左移后右移清除高b位,右移后左移清除低b位。 對於示例數據,值為0x02345670 這等效於 32 位數字的掩碼0x0ffffff0的按位AND 該班次適用於任何無符號 integer 類型,無論其大小如何。

  3. 將高位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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM