Просмотр полной версии : Проверка бита в макросе панели СП300
Добрый день.
Есть переменная PSW[369]. У нее нужно проверить 6 бит. И если он 1 то установить бит 6 в переменной PSW[1369]....
WORD tmp;
tmp = PSW[369];
if ((tmp>>6) & 0x01)
{
PSW[1369] = PSW[1369] | (1<<6);
}
else
{
PSW[1369] = PSW[1369] & (0<<6);
}
Но такая конструкция не работает. Уважаемые спецы, почему?
Заранее спасибо...
Евгений Кислов
02.03.2017, 12:43
Добрый день. Используйте следующую конструкцию:
if ( PSW[369] & (1<<6) )
{
PSW[1369] = PSW[1369] | (1<<6);
}
else
{
PSW[1369] = PSW[1369] & ~(1<<6);
}
Внесем соответствующие правки в следующую версию РП.
Вот пример работы с памятью через макросы (набор готовых функций):
http://www.owen.ru/forum/showthread.php?t=25952&p=233959&viewfull=1#post233959
В рамках этого примера можно было бы сделать так:
WriteBitInReg(1369, 6, GetBitFromReg(369,6,TYPE_PSW), TYPE_PSW);
То есть будет работать условие
if ( PSW[369] & 0x40 ) ......
Это ошибка в коде панели?
Евгений Кислов
02.03.2017, 12:51
То есть будет работать условие
if ( PSW[369] & 0x40 ) ......
Это ошибка в коде панели?
Ошибка в документации, если точнее.
Запись типа
if ( PSW[369] & 0x40 )
вполне легитимна.
Обращаю внимание - в элементе при выборе бита они пронумерованы с нуля.
Т.е. в данном случае шестой бит - это именно 0x40.
Простите, но я что то запутался(((
Оператор IF логический. У него условие либо истина либо лож... либо 1 либо 0....
если PSW[369] = 255 то есть 11111111
то
11111111 & 01000000 = 01000000 или 0x40 или 64
получается
if (64)
{
......
} else
{
......
}
Как то не очень.....
а вот:
if (64 == 64)
{
......
} else
{
......
}
или
if ( (PSW[369] & 0x40) == 0x40)
{
....
}
Вполне логично!
Евгений Кислов
02.03.2017, 14:03
Все сказанное верно и логично. Компилятор устроит любой из двух видов записи.
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot