работа с битами

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
katafey
Сообщения: 30
Зарегистрирован: Сб июн 04, 2016 9:24 am
Благодарил (а): 12 раз
Поблагодарили: 8 раз

работа с битами

Сообщение katafey » Чт дек 22, 2016 10:29 am

Объясните пожалуйста как работать с битами в php в частности нужна операция проверки состояния бита
СпойлерПоказать

Код: Выделить всё

//Очистить бит reg &= (~(1<<(bit)))
// Установить бит reg |= (1<<(bit))
// инвертировать бит reg ^= (1<<(bit))

$bit = $bit ^= (1<<(1));
$bit = $bit ^= (1<<(4));//invert bit 4
say("BIN = ".decbin($bit)." DEC = ".$bit);
$bit = $bit ^= (1<<(1));//inverbit 1
say("BIN = ".decbin($bit)." DEC = ".$bit);
$bit = $bit &= (~(1<<(4))); // очистка бита 4
$bit |= (1<<(2)); //Set bit 2 
say("BIN = ".decbin($bit)." DEC = ".$bit);
sleep(1);
if((($bit & (1<<(0))) == 0)){
 say("BIN = ".decbin($bit)." DEC = ".$bit);
 #mesaga = "сработало";
}
 say($mesaga);
не хочет работать if - что я делаю не так?
Алиса выдает последнюю пустую строку
СпойлерПоказать
09:07 Алиса:
09:07 Алиса: BIN = 100 DEC = 4
09:07 Алиса: BIN = 100 DEC = 4
09:07 Алиса: BIN = 10000 DEC = 16
09:07 Алиса: BIN = 10010 DEC = 18
примеры взяты из
СпойлерПоказать

Код: Выделить всё

/*
Макросы для работы с битами
http://chipenable.ru/index.php/programming-avr/item/4-uchebnyy-kurs-kak-rabotat-s-bitami-makroopredeleniya.html

Примеры использования:
SetBit(PORTD,0);  Установить нулевой бит порта D
ClearBit(PORTD,0); Сбросить нулевой бит порта D
InvBit(PORTD, 0); Инвертировать нулевой бит порта D

if  (BitIsClear(PIND, 0)) {   //если очищен нулевой бит в регистре PIND
…..                                     //выполнить блок
}

if  (BitIsSet(PIND, 0)) {   //если Установлен нулевой бит в регистре PIND
…..                                     //выполнить блок
}
*/

#ifndef BITS_MACROS_
#define BITS_MACROS_
/***********************************************************
//BITS MACROS
//PASHGAN 2009
//CHIPENABLE.RU
//
//reg : имя переменной, регистра
//bit : позиция бита
//val : 0 или 1
************************************************************/
#define Bit(bit)  (1<<(bit))
#define Lo_Byte(x) (x&0xFF)
#define Hi_Byte(x) ((x>>8)&0xFF)
#define union_byte_macro(h,l) (h<<8|l)

#define ClearBit(reg, bit)       reg &= (~(1<<(bit)))
//пример: ClearBit(PORTB, 1); //сбросить 1-й бит PORTB

#define SetBit(reg, bit)          reg |= (1<<(bit))
//пример: SetBit(PORTB, 3); //установить 3-й бит PORTB

#define SetBitVal(reg, bit, val) do{if ((val&1)==0) reg &= (~(1<<(bit)));\
else reg |= (1<<(bit));}while(0)
//пример: SetBitVal(PORTB, 3, 1); //установить 3-й бит PORTB
//      SetBitVal(PORTB, 2, 0); //сбросить 2-й бит PORTB

#define BitIsClear(reg, bit)    ((reg & (1<<(bit))) == 0)
//пример: if (BitIsClear(PORTB,1)) {...} //если бит очищен

#define BitIsSet(reg, bit)       ((reg & (1<<(bit))) != 0)
//пример: if(BitIsSet(PORTB,2)) {...} //если бит установлен

#define InvBit(reg, bit)      reg ^= (1<<(bit))
//пример: InvBit(PORTB, 1); //инвертировать 1-й бит PORTB

#endif//BITS_MACROS_    
спасибо
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: работа с битами

Сообщение nick7zmail » Чт дек 22, 2016 2:53 pm

Если я правильно помню - "И" в пхп ставится как "&&", могу ошибаться...
За это сообщение автора nick7zmail поблагодарил:
katafey (Чт дек 22, 2016 4:07 pm)
Рейтинг: 1.16%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: работа с битами

Сообщение sergejey » Чт дек 22, 2016 3:16 pm

ещё как вариант

Код: Выделить всё

$bin = decbin($byte);
$bin = str_pad($bin, 8, 0, STR_PAD_LEFT);
if (substr($bin,7,1)=='1') { // проверяем 7й бит
 say(...);
} 
За это сообщение автора sergejey поблагодарил:
katafey (Чт дек 22, 2016 4:06 pm)
Рейтинг: 1.16%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
katafey
Сообщения: 30
Зарегистрирован: Сб июн 04, 2016 9:24 am
Благодарил (а): 12 раз
Поблагодарили: 8 раз

Re: работа с битами

Сообщение katafey » Чт дек 22, 2016 4:06 pm

nick7zmail писал(а):Если я правильно помню - "И" в пхп ставится как "&&", могу ошибаться...
все верно но, работать не хочет.
sergejey писал(а):ещё как вариант

Код: Выделить всё

$bin = decbin($byte);
$bin = str_pad($bin, 8, 0, STR_PAD_LEFT);
if (substr($bin,7,1)=='1') { // проверяем 7й бит
 say(...);
}  

Спасибо работает.
Ответить