簡體   English   中英

將 int 中的最后 10 位向左旋轉

[英]Rotate left the last 10 bits in an int

我需要實現一個向左旋轉 int 的最后 10 位的 function。

所以如果一個 int 有值

0b 1111 0000 0000 0000 0000 1100 1100 0000

左旋轉 2 會給我們

0b 1111 0000 0000 0000 0000 1111 0000 0000

進一步向左旋轉 1 將給出

0b 1111 0000 0000 0000 0000 1110 0000 0001
  • ptr - 指向我們要旋轉的給定 int 的指針
  • n - 我們想要旋轉多少次
void leftRotateLast10Digits(int * ptr, int n) {

}

如果我們想旋轉整個 int,我知道該怎么做,但我不確定如何只對最后 10 位數字進行操作。 我想左旋轉一個int,它看起來像下面這樣。 但是,我仍然不明白如何只旋轉最后 10 位數字。

void leftRotate(int * ptr, int n) {
    int DROPPED_MSB;
    int INT_BITS = sizeof(int) * 8 - 1;
    int num = *ptr;

    // The effective rotation
    n %= INT_BITS;

    while(n) {
        DROPPED_MSB = (num >> INT_BITS) & 1; 

        // Left rotate num by 1 and set its dropped MSB as new LSB
        num = (num << 1) | DROPPED_MSB;
        n--;
    }
    *ptr = num;
}

我不知道如何只處理最后 10 位數字

將 10 位與 rest 隔離。

旋轉 10 位(我會跳過while循環)。

“或”將 10 位返回int


(讓我們使用“最少”而不是“最后”)

void leftRotateLeast10Digits(int *ptr, int n) {
  int value = *ptr;
  int ls10bits = value & 0x3FF;
  value ^= ls10bits;  // zero out the 10 LS bits.
  
  // If `n` outside [0...9] range needed
  n %= 10;
  if (n < 0) n += 10;

  // move LS bits left `n` times` and MS bits right `10-n` times.
  int rotated = (ls10bits << n) | (ls10bits >> (10-n));
  rotated &= 0x3FF;

  value |= rotated;
  *ptr = value;
}

支持 16 位int需要一些額外的工作。 int ls10bits --> int_least32_t ls10bits輕松處理<<
當結果不是陷阱時,我建議這也適用於罕見的非 2 補碼。


提示:位操作和移位最好用無符號類型和數學來完成,而不是像int這樣的有符號類型。

一個相對簡單的方法是將 integer 分成兩部分:應該旋轉的 10 位和不應該旋轉的其他(高位)位。 然后,在旋轉適當的部分后,使用按位或運算恢復其他位:

void leftRotate(int* ptr, int n)
{
    int mask = 0x03FF; // Mask for lower 10 bits;
    int DROPPED_MSB;
    int INT_BITS = 10; // Only work with 10 bits
    int num = *ptr & mask; // Extract JUST low 10 bits
    int top = *ptr & ~mask; // Save all the OTHER bits
    n %= INT_BITS; // The effective rotation
    while (n) {
        DROPPED_MSB = (num >> INT_BITS) & 1;
        // Left rotate num by 1 and set its dropped MSB as new LSB
        num = (num << 1) | DROPPED_MSB;
        n--;
    }
    *ptr = num | top; // Restore the saved upper bits
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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