2014-12-18 2 views
1

Все, что мне нужно, чтобы с самого нуля установить бит. Мой подход заключается в том, чтобы найти позицию самого правого бита, затем с этого бита. Я пишу этот код для этого.Выключить самый правый бит бит целого числа

int POS(int n) 
{ 
    int p=0; 

    while(n) 
    { 
     if(n%2==0) 
     { 
      p++; 
     } 
     else 
     { 
      break; 
     } 
     n=n/2; 
    } 
    return p; 
    } 

int main(void) 
{ 

int n=12; 
int p = POS(n); 
printf("%d \n", n&~(1<<p)); 

return 0; 

} 

Простой способ?

+1

что такое 'OFF()'? –

ответ

-2

Я думаю, что самый простой способ заключается в использовании выражение:

n & n - 1 

Также вы можете использовать следующие действия прямолинейный подход

#include <iostream> 
#include <iomanip> 

int reset_bit(int x) 
{ 
    if (x != 0) 
    { 
     unsigned int n = 1; 
     while (!(x & n)) n <<= 1; 
     x ^= n; 
    } 

    return x; 
} 

int main() 
{ 
    for (int x = 1; x < 16; ++x) 
    { 
     std::cout << std::hex << x << '\t' << reset_bit(x) << std::endl; 
    } 

    return 0; 
} 

Выход

3 2 
4 0 
5 4 
6 4 
7 6 
8 0 
9 8 
a 8 
b a 
c 8 
d c 
e c 
f e 
0

Если вы говоря об очистке младшего значащего бита , который в настоящее время установлен, использование:

num = num & (num - 1); 

Смысл этого в том, что ряд как xxxx1000 (где x означает «исходное значение») станет xxxx0111, когда вы вычтем одно и Андинг эти два значения, получаем:

xxxx1000 
& xxxx0111 
    -------- 
    xxxx0000 

очистка самой правой однобитовой.


На авось я неправильно понял вопрос, если вы хотите установить крайний правый (младший) бит к нулю, все, что вам нужно:

num = num - (num % 2); 

Это просто вычитает один от нечетных чисел и ничего от четных чисел, эффективно делая результат двоичным xxxxxxx0.

Для очистки конкретного бита, где бит 0 является наименее значимым, использование:

num = num & ~(1 << bitpos); 

Это устанавливает битые маски IKE 00001000 и переворачивают его 11110111 так, что Андинг он очистит соответствующий бит :

xxxxxxxx 
& 11110111 
    -------- 
    xxxx0xxx 

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

+0

wow .. Существует много способов –

0

Я думаю, что вы ищете это:

printf("%d \n", n&(n-1)); 

Это на самом деле работает. Потому что:

1010 = 10  111 = 7 
1001 = 9  110 = 6 
----    --- 
1000 = 8  110 = 6 

Надеюсь, вы понимаете идею ..

ссылка: Turn off the rightmost bit of an integer (прочитать)

Или вы можете изменить свой код, как следующие:

int POS(int n) 
{ 
    int p=0; 

    while(!(n&1)) 
    { 
     p++; 
     n=n>>1; 
    } 

    return p; 
} 
+0

Спасибо за объяснение .. –

Смежные вопросы