Подскажите, как описать данную операцию. Спасибо. данные Hex: 0х0040 7B9E (получаем Dec: 4225950), убираем 6 и 7 бит из старшего регистра 0х0040 7B9E AND 0x003F FFFF = 0x0000 7B9E = Dec: 31646
@Load48, неплохо было бы описать смысловую нагрузку этого мракобесия, или убирание страшного 6-го и еще страшнее 7-го регистров должно о чём-то говорить?
Это данные из регистра считывание показаний мощности, Мощность передается в 2х регистрах, и во втором регистре в 6 и 7 бите кодируется направление активной и реактивной энергии. Данные из 6 и 7 бита значение лишние. Они искажают нужные значения.
&, хотя ХЗ, что значит «описать». Обозначить? @Valick, ??? ТС про биты 6 и 7 говорил. Что он называет старшим регистром, было показано. --- Добавлено --- P.S. @Load48, той маской вы не только биты 6 и 7 «убираете», но еще и все биты старшего байта
0х0040 7B9E В бинарном виде 10000000111101110011110 было 0x0000 7B9E В бинарном виде 111101110011110 стыло AND 0x003F FFFF - обнуление 6 и 7 бит На проф. калькуляторе считается легко. Не знаю, как описать это на PHP,
>>>>>>>>>>>P.S. той маской вы не только биты 6 и 7 «убираете», но еще и все биты старшего байта Уточняю по маске AND 0x003F FFFF
@Valick, я про то, зачем вносить доп. путаницу? ТС ничего не писал про 6-ой и 7-ой регистры P.S. Вопрос походу в названии темы. И, да, он явно не заслуживает того раздела, в котором создан топик.
$a = "0x".dechex(64).dechex(31646); //$a = 0x407B9E; $b = 0x003FFFFF; $c = $a & $b; echo $c; ----------------- <br /> <b>Notice</b>: A non well formed numeric value encountered in <b>[...][...]</b> on line <b>11</b><br /> 0
Почему троль? Попытался подставить данные. 64 данные из одного регистра 31646 из второго $a = "0x".dechex(64).dechex(31646); $a = 0x407b9e; Как перевести данное значение в формат который необходим для восприятия его "AND"? $b = 0x003FFFFF; $c = $a & $b; При отработке я получаю: A non well formed numeric value encountered
function convs($f, $f1) { $a = "0x".dechex($f1).dechex($f); $a = intval($a,16); $b = 0x003FFFFF; $c = $a & $b; return $c; } echo convs(60649,2);
@Load48 для записи шестнадцатиричных чисел не надо использовать никаких кавычек и пробелов. Пиши как есть, и будет счастье.
@Load48, Для начала загляни в раздел "побитовые операции", следом - "целые числа" (каким образом в PHP они записываются в различных системах счисления) Далее... Пример: Код (Text): // полученное число $reg2 = 0x7B9E; // маска с нулевыми битами 6 и 7, нумерация начинается слева, с числа 0 (ноль). $mask = 0b1111111100111111; // пересчитайте цифры после 0b их должно быть 16 $reg2new = $reg2 & $mask; // лучше, говорят, один раз увидеть: var_dump(decbin($reg2), decbin($reg2new)); PS: вместо 0xB9E для наглядности можно взять число 0xFFFF --- Добавлено --- Причём какое число во "втором регистре" получили - с тем и выполняйте "побитовое И", без предварительной обработки...
Число 0x407b9e переводить не надо, пых понимает числа в этом формате. Строку с этим числом нужно переводить в собственно число, например при помощи hexdec (префикс 0x лучше заранее отбросить или вообще его не использовать). --- Добавлено --- P.S. Вас могло смутить неявное преобразование строк вроде "123" в соотв. числа, которое делает пых. Но это касается только десятичных чисел, а не шестнадцатеричных. В большинстве др. языков нужно всегда явно преобразовывать строки в числа, т.е. при их использовании у вас такого недоразумения могло и не случиться. --- Добавлено --- P.P.S. Если вам правда нужен алгоритм преобразования, то используйте соотв. формулу разложения числа, например E*16в0 + 9*16в1 + B*16в2 + ... = 14*1 + 9*16 + 11*256 + ... Алгоритм, естественно, будет циклическим.