Когда-то давно наткнулся на тему, где парень не мог разобраться почему не работает так, как надо такая операция
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)){}.Что уже зависит от вашего стиля программирования!
Спасибо за внимание.
Все пожелания и вопросы в комменты!
Комментариев нет:
Отправить комментарий