簡體   English   中英

激活 C 中數字的一些位

[英]Activate some bits of a number in C

我需要實現 function int activate_bits(int a, int left, int right)應該“激活”數字 a 左側和右側的所有位(不包括左右位)。

到目前為止,我想出了這個:

int activate_bits(int a, int left, int right)
{
    int n, j, mask, masked_a;

    for (n = 1; n < left; n++) {
        mask = 1 << n;
        masked_a = a | mask;
    }

    for (j = 31; j > right; j--) {
        mask = 1 >> j;
        masked_a = a | mask;
    }

    return masked_a;
}

誰能幫我解釋為什么masked_a不正確或修復我的錯誤代碼?

我懷疑您需要在循環之前將masked_a設置為a

int activate_bits(int a, int left, int right)
{
    int n, j, mask, masked_a;

    masked_a = a;

    for (n = 0; n < left; n++) {
        mask = 0x80000000 >> n;
        masked_a = masked_a | mask;
    }

    for (j = 0; j < right; j++) {
        mask = 1 << j;
        masked_a = masked_a | mask;
    }

    return masked_a;
}

編輯:我已經將循環更新為我認為正確的內容,盡管這取決於預期的答案是什么可以解釋。 為早先的錯誤回復道歉,我只是指出了明顯的錯誤,這可能應該是一個評論。

  1. 在原始代碼中right切換,因為left是最高位,右邊是最低位。
  2. 將 masked_a 初始化為 a
  3. 1>>j更改為1<<j

假設你的左右是從 1 開始的

int activate_bits(int a, int left, int right)
{
    int n, j, mask, masked_a = a;

    for (n = 0; n < right - 1; n++) {
        mask = 1 << n;
        masked_a = a | mask;
    }

    for (j = 31; j > 31 - left + 1; j--) {
        mask = 1 << j;
        masked_a = a | mask;
    }

    return masked_a;
}

一些設置、重置和寫入新值的功能

unsigned set_bits(unsigned a, unsigned pos, unsigned size)
{
    unsigned mask = ((1 << size) - 1) << pos;
    return a |  mask;
}

unsigned reset_bits(unsigned a, unsigned pos, unsigned size)
{
    unsigned mask = ((1 << size) - 1) << pos;
    return a & ~(mask);
}


unsigned write_bits(unsigned a, unsigned newVal, unsigned pos, unsigned size)
{
    unsigned mask = ((1 << size) - 1);
    newVal &= mask;
    mask <<= pos;

    return (a & ~(mask)) | newVal << pos;
}

制作你的單位:

right = pos
left = pos + size - 1;

我有同樣的問題。 我已經嘗試了上面的解決方案,但沒有一個對我有用,因為我認為沒有人完全理解你想要什么。 我知道已經一年了,但這對我有用,我相信這很簡單:

int activate_bits(int a, int left, int right) {

    left = 31 - left;

    int i;
    for (i = 0; i < left; i++) {
        a = a | (0x80000000 >> i);
    }

    for (i = 0; i < right; i++) {
        a = a | (1 << i);
    }

    return a;
}

暫無
暫無

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

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