2015-01-07 4 views
0

Я не буду устанавливать последние n бит любого заданного числа в 1. У меня есть число (которое переменной в его длине) и переменная n.Установить последние n бит в C

Пример:

12 (dec) set last 2 bits 
Output: 15 

Теперь основная операция должна быть что-то вроде:

return 0b11 | 12; 

Но как я могу сделать 0b11 переменной длины?

Спасибо!

ответ

3

Попробуйте это:

int SetLastBits(int value,int numOfBits) 
{ 
    return value | ((1<<numOfBits)-1); 
} 
+2

Вы бьете меня на 2 секунды! ;-) –

+1

@PaulR: Ха-ха, да, я сделал. И ответы более или менее идентичны :) –

+0

И здесь вы, вероятно, хотите беззнаковое, а не int, так как смещение отрицательных чисел не определено:/ – tux3

3

Вы можете сделать это следующим образом:

uint32_t set_last_n_bits(uint32_t x, uint32_t bits) 
{ 
    return x | ((1U << bits) - 1U); 
} 

Это также относительно редкий случай, когда макрос может быть оправдано на том основании, что он будет работать с различные целые типы.

+0

Почему uintX_t вместо простого беззнакового ? Тем более, что 32-битные системы становятся все менее и менее распространенными. – tux3

+1

И вы били * me * 24 секунды ... Я вернусь к практике более быстрой печати: P –

+0

@ tux3: ну, большинство 64-битных систем LP64, где int все еще 32 бит, но независимо от того, что это обычно хорошая идея чтобы указать размер типа int, а не оставить его судьбе.Разумеется, не стесняйтесь адаптировать пример к вашим конкретным потребностям. –

3

Вы можете установить последние п битов числа 1 следующим образом:

int num = 5; // number of bits to set to 1 

int val = <some_value>; 

val |= (1 << num) - 1; 
+0

1 << 5 is 100000 минус 1 is 11111 Конечно, смещение на n бит дает мне один бит больше, чем мне нужно. Иногда это может быть так просто ... – kernelpanic

+2

@kernelpanic нечестно, что вы принимаете мой ответ. Я был медленнее на 26 секунд, и, как видно из комментариев, барак манос - это тот, который заслуживает принятия. –

+1

Исправлено. Спасибо всем, так или иначе! – kernelpanic

2

Как и все другие показали тот же подход, я покажу еще один подход

int value; 

//... 

value |= ~(~0u << n); 

Здесь демонстративная программа

#include <stdio.h> 

int set_bits(int x, size_t n) 
{ 
    return x | ~(~0u << n); 
} 

int main(void) 
{ 
    int x = 12; 

    printf("%d\t%d\n", x, set_bits(x, 2)); 

    return 0; 
} 

выход

12 15 
+0

Как я понимаю, ~ (1 << n) также должен работать? Есть ли большее значение для этого причудливого способа сказать 1? – kernelpanic

+0

@kernelpanic Нет, это не сработает правильно, потому что все биты до 1 будут установлены также на 1. –

+0

Итак, для n = 5 моя будет 1 ... 1011111, а ваша будет 0 ... 0000000, это правильно? – kernelpanic

-1

Альтернативный способ:

int SetLastNBits(int val,int N) 
{ 
return val | (~ (~0<<N)); 
}