среда, 27 июля 2011 г.

Поразрядные и логические операции.


Когда-то давно наткнулся на тему, где парень не мог разобраться почему не работает так, как надо такая операция

if(pad.buttons & PSP_CTRL_CIRCLE & PSP_CTRL_SQUARE){}

 

Он писал что этот код не работает(если вы уже поняли в чем же пробема можете не читать дальше,а если нет продолжаем...).

Давайте разберемся в чем же проблема.


В С, и других производных от него языков устоялся вот такой синтаксис
&& - логическое и
|| - логическое или
&  - поразрядное и
|  - поразрядное или
Давайте посмотрим чем же они отличаются!
 
Поразрядное "и" работает как как показано далее(псевдокод):

VAR A =  0000 1111 
VAR B =  1100 1100
A & B => 0000 1100

 

Только те биты, значение которых было 1 в двоичном коде в обоих переменные, являются результатом &.


 

Поразрядное "или":

VAR A =  0000 1111 
VAR B =  1100 1100
A | B => 1100 1111

 

Логическое "и" равно 0 в том случае если одно из выражений = 0

Пример:

&&
100 && 5 => 1
100 && 0 => 0

 

Логическое "или" равно 0 лишь в том случае если оба выражения = 0

||
100 || 5 => 1
100 || 0 => 1
0   || 0 => 0


И так мы поняли то что
if(pad.buttons & PSP_CTRL_CIRCLE & PSP_CTRL_SQUARE){}

в любом случае = 0:

PSP_CTRL_CIRCLE =>(0010 0000 0000 0000)=>0x2000(2000h)
PSP_CTRL_SQUARE  =>(1000 0000 0000 0000)=>0x8000(8000h)
PSP_CTRL_CIRCLE & PSP_CTRL_SQUARE => 0
0 & (Любое число) => 0
Таким образом если мы хотим узнать нажаты ли 2 кнопки мы должны писать либо так

if((pad.buttons & PSP_CTRL_CIRCLE) && (pad.buttons & PSP_CTRL_SQUARE)){}
либо так

if(pad.buttons & (PSP_CTRL_CIRCLE || PSP_CTRL_SQUARE)){}.
Что уже зависит от вашего стиля программирования!

Спасибо за внимание.

Все пожелания и вопросы в комменты!


 


 

Комментариев нет:

Отправить комментарий