2013-08-12 2 views
-3
void main() 
{ 
int x=7; 
printf("%d",x&(x-1)); 
int y=6; 
printf("%d",y&(y-1)); 
printf("%d",y>>2); 


} 

Когда я помещаю нечетное число, я получаю вывод n-1, где n - нечетное число, но когда я положил y = четное число, я получаю вывод 0. Я не могу понять это пожалуйста помоги.Объяснение вывода побитовых операций

Мой второй вопрос заключается в том, что когда я печатаю y >> 2, то есть 6 >> 2 Я получаю вывод 1. Пожалуйста, объясните мне это также. Я знаю, что эти битовые операции, но моя концепция не clear.Thanks

+4

http : //en.wikipedia.org/wiki/Bitwise_operations_in_C - возьмите бумагу и ручку (cil) и обработайте ее. –

+1

Кроме того, '(x & (x-1)) == 0' может использоваться для проверки того, является ли' x' мощность 2 (или 0) – P0W

ответ

0

Давайте разберем каждую строку вверх:

x&(x-1) => 0x111 & 0x110 => 0x110 => 6 

... и:

y&(y-1)) => ox110 & 0x101 => 0x100 => 4 

... и, наконец:

y>>2 => 0x110 >> 2 => 0x001 => 1 

Примечание: Это, вероятно, хорошая идея, чтобы рассмотреть ваше ноу выступ bitwise operations.

0

Побитовые операции - это именно то. вы берете свой номер, а вы and каждый бит с другим номером.

Что это означает, то, если оба числа имеют 1 в слот, чем вы выводите 1, иначе вы выходной 0

так, для примера 7 у вас есть

0111 
0110 

результата :

0110 (6) 

для примера 6 у вас есть

0110 
0101 

результат:

0100 (4) 

сдвиг вправо (>>) просто сдвигает все биты вправо, так что если вы берете 6

0110 

и переложить все биты вправо дважды, вы получаете

0001 

или 1

0

Когда я поставил нечетное число я получаю выход п-1, где п является нечетным числом, но когда я поставил у = четное число, я получаю выход 0.I я не в состоянии поймите это, пожалуйста, помогите.

С бинарного хранения младший бит всегда 1 для нечетных чисел, но так как вы Андинг, вы в действительности просто вернув исходное значение-1 всегда (потому что биты не сместились). В случае четных чисел не все из них будут 0: 8 будут: 1000 & 0111 = 0.6 не будет: 0110 & 0101 => 0100 = 4.

Мой второй вопрос заключается в том, что, когда я печать у >> 2 т 6 >> 2 Я получаю Ouput 1.Please объяснить мне >> это также. Я знаю, что эти битовые операции, но моя концепция не clear.Thanks

Этом, как деление на 2 раза. так что 6-> 3-> 1,5. Но часть фракции усечена, поэтому вы останетесь с 1. В двоичном выражении это будет 0110 -> 0011 -> 001.1 = 1.5 (десятичный), но с усечением = 0001.

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