За последние 24 часа нас посетили 22546 программистов и 1039 роботов. Сейчас ищут 644 программиста ...

Операции с битами на php как реализовать

Тема в разделе "Прочие вопросы по PHP", создана пользователем Load48, 28 ноя 2019.

  1. Load48

    Load48 Новичок

    С нами с:
    28 ноя 2019
    Сообщения:
    13
    Симпатии:
    0
    Подскажите, как описать данную операцию. Спасибо.

    данные Hex: 0х0040 7B9E (получаем Dec: 4225950), убираем 6 и 7 бит из старшего регистра
    0х0040 7B9E AND 0x003F FFFF = 0x0000 7B9E = Dec: 31646
     
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Load48, неплохо было бы описать смысловую нагрузку этого мракобесия, или убирание страшного 6-го и еще страшнее 7-го регистров должно о чём-то говорить?
     
  3. Load48

    Load48 Новичок

    С нами с:
    28 ноя 2019
    Сообщения:
    13
    Симпатии:
    0
    Это данные из регистра считывание показаний мощности,

    Мощность передается в 2х регистрах, и во втором регистре в 6 и 7 бите кодируется направление активной и реактивной энергии.

    Данные из 6 и 7 бита значение лишние. Они искажают нужные значения.
     
  4. Load48

    Load48 Новичок

    С нами с:
    28 ноя 2019
    Сообщения:
    13
    Симпатии:
    0
    0х0040 - первый регистр
    7B9E - Второй регистр
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    &, хотя ХЗ, что значит «описать». Обозначить?

    @Valick, ??? ТС про биты 6 и 7 говорил. Что он называет старшим регистром, было показано.
    --- Добавлено ---
    P.S. @Load48, той маской вы не только биты 6 и 7 «убираете», но еще и все биты старшего байта ;)
     
  6. Load48

    Load48 Новичок

    С нами с:
    28 ноя 2019
    Сообщения:
    13
    Симпатии:
    0
    0х0040 7B9E В бинарном виде 10000000111101110011110 было
    0x0000 7B9E В бинарном виде 111101110011110 стыло
    AND 0x003F FFFF - обнуление 6 и 7 бит

    На проф. калькуляторе считается легко. Не знаю, как описать это на PHP,
     
  7. Load48

    Load48 Новичок

    С нами с:
    28 ноя 2019
    Сообщения:
    13
    Симпатии:
    0
    Описать. Это скрипт php, который выполняет обнуление данные из 6 и 7 бита.
     
  8. Load48

    Load48 Новичок

    С нами с:
    28 ноя 2019
    Сообщения:
    13
    Симпатии:
    0
    Возможно. Данную маску получил от разработчика железки :) С ней данные получаются точные :)
     
  9. Load48

    Load48 Новичок

    С нами с:
    28 ноя 2019
    Сообщения:
    13
    Симпатии:
    0
    >>>>>>>>>>>P.S. той маской вы не только биты 6 и 7 «убираете», но еще и все биты старшего байта ;)

    Уточняю по маске AND 0x003F FFFF :)
     
  10. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @miketomlin, а ты внимательно прочитал моё сообщение? :)
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @Valick, я про то, зачем вносить доп. путаницу? ТС ничего не писал про 6-ой и 7-ой регистры ;)

    P.S. Вопрос походу в названии темы. И, да, он явно не заслуживает того раздела, в котором создан топик.
     
    #11 miketomlin, 28 ноя 2019
    Последнее редактирование: 28 ноя 2019
  12. Load48

    Load48 Новичок

    С нами с:
    28 ноя 2019
    Сообщения:
    13
    Симпатии:
    0
    & - ?

    <?

    $a = "0х0040 7B9E";
    $b = "0x003F FFFF";

    $c = $a & $b;

    echo $c;

    Result: "0P�00 �B�"; ????
     
  13. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Обозначение AND.

    Кавычки и пробел убери у операндов ;)
     
    #13 miketomlin, 28 ноя 2019
    Последнее редактирование: 28 ноя 2019
  14. Load48

    Load48 Новичок

    С нами с:
    28 ноя 2019
    Сообщения:
    13
    Симпатии:
    0

    Не судите строго. :)
     
  15. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    ты на полном серьёзе уверен в существовании сТраШных регистров?))
     
  16. Load48

    Load48 Новичок

    С нами с:
    28 ноя 2019
    Сообщения:
    13
    Симпатии:
    0

    $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
     
  17. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Бамбарбия киргуду :)

    Тролль? Отдыхай.
     
    #17 miketomlin, 28 ноя 2019
    Последнее редактирование: 28 ноя 2019
  18. Load48

    Load48 Новичок

    С нами с:
    28 ноя 2019
    Сообщения:
    13
    Симпатии:
    0

    Почему троль?


    Попытался подставить данные.
    64 данные из одного регистра
    31646 из второго

    $a = "0x".dechex(64).dechex(31646);

    $a = 0x407b9e;

    Как перевести данное значение в формат который необходим для восприятия его "AND"?

    $b = 0x003FFFFF;

    $c = $a & $b;

    При отработке я получаю: A non well formed numeric value encountered
     
  19. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.552
    Симпатии:
    1.754
    @Load48, а без строки, числом никак не записать?
     
  20. Load48

    Load48 Новичок

    С нами с:
    28 ноя 2019
    Сообщения:
    13
    Симпатии:
    0
    У меня не получилось.
     
  21. Load48

    Load48 Новичок

    С нами с:
    28 ноя 2019
    Сообщения:
    13
    Симпатии:
    0
    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);
     
  22. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    @Load48 для записи шестнадцатиричных чисел не надо использовать никаких кавычек и пробелов. Пиши как есть, и будет счастье.
     
  23. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Load48, Для начала загляни в раздел "побитовые операции", следом - "целые числа" (каким образом в PHP они записываются в различных системах счисления)
    Далее...
    Пример:
    Код (Text):
    1. // полученное число
    2. $reg2 = 0x7B9E;
    3. // маска с нулевыми битами 6 и 7, нумерация начинается слева, с числа 0 (ноль).
    4. $mask = 0b1111111100111111; // пересчитайте цифры после 0b их должно быть 16
    5. $reg2new = $reg2 & $mask;
    6. // лучше, говорят, один раз увидеть:
    7. var_dump(decbin($reg2), decbin($reg2new));
    PS: вместо 0xB9E для наглядности можно взять число 0xFFFF
    --- Добавлено ---
    Причём какое число во "втором регистре" получили - с тем и выполняйте "побитовое И", без предварительной обработки...
     
  24. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Число 0x407b9e переводить не надо, пых понимает числа в этом формате. Строку с этим числом нужно переводить в собственно число, например при помощи hexdec (префикс 0x лучше заранее отбросить или вообще его не использовать).
    --- Добавлено ---
    P.S. Вас могло смутить неявное преобразование строк вроде "123" в соотв. числа, которое делает пых. Но это касается только десятичных чисел, а не шестнадцатеричных. В большинстве др. языков нужно всегда явно преобразовывать строки в числа, т.е. при их использовании у вас такого недоразумения могло и не случиться.
    --- Добавлено ---
    P.P.S. Если вам правда нужен алгоритм преобразования, то используйте соотв. формулу разложения числа, например E*16в0 + 9*16в1 + B*16в2 + ... = 14*1 + 9*16 + 11*256 + ... Алгоритм, естественно, будет циклическим.
     
  25. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    Тема перемещена. Сообщение содержит вопрос, а не решение или алгоритм.