powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Битовые поля в PHP
11 сообщений из 36, страница 2 из 2
Битовые поля в PHP
    #38295855
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,

По поводу переносимости... Знал это только со слов, так как уже говорил, asp.net ни разу не юзал.
Потому решил загуглить... и вот первая же открытая ссылка (кроме тех, где на 10 страницах рассказывается как настроить linux сервер под работу с asp)
английское обсуждение (сорри... русского не нашёл)

Как видим, в любой момент можно столкнуться с ситуацией, когда написанный на asp.net проект (в windows) не запуститься в linux (так как в линуксе mono поддерживает малую часть функций данного фреймворка)

P.S. Не забываем, что mono - это не продукт от майкрософта, а значит можно считать, что .net не переносима на линукс сервер (ведь mono - это бесплатная штука, которую в любой мемент могут перестать разрабатывать и поддерживать и всё :) )
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38295890
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nop. Вопрос заключался в том, есть ли в PHP что-то столь же удобное для работы с битовыми полями как в Си.
стольже удобного - НЕТ, но это возможно. но придется многое делать вручную
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38295957
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopДа побитовые операции - это понятно. Они где угодно есть. Вопрос заключался в том, есть ли в PHP что-то столь же удобное для работы с битовыми полями как в Си.

Насколько мне известно, ничего подобного в php нету... Но учитывая, что размер структуры меньше размера integer:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
class DeviceData{

  const A = 0xF;
  const B = 0xFFFF0;
  const C = 0xF00000;
  const D = 0x3000000;
  const E = 0xFC000000;

  protected $data = 0;
  function __contsruct(){}
  function __destruct(){}
  function setData($val, $mask){
    if ($mask==0) return $this->data;
    $m=0;
    $off=0;
    do{
      $off++;
      $m = ($m << 1) | 1;
    }while(($mask & $m) == 0);
    $off--;
    $this->data = ($this->data & ~$mask) | (($val >> $off) & $mask);
    return $this->data;
  }
}



В принципе за 5 минут писано... Может где ошибся, не проверял... По аналогии (только легче немного) чтение по маске... Маски предопределяем в классе (для удобства)... и всё. Вот удобный инструмент (ограничивающийся размеров integer).
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38296117
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да... как чувствовал, что ошибся ))

написал:
Код: php
1.
$this->data = ($this->data & ~$mask) | (($val >> $off) & $mask);



а надо:
Код: php
1.
$this->data = ($this->data & ~$mask) | (($val << $off) & $mask);
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38297551
nop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрnopДа побитовые операции - это понятно. Они где угодно есть. Вопрос заключался в том, есть ли в PHP что-то столь же удобное для работы с битовыми полями как в Си.

Насколько мне известно, ничего подобного в php нету... Но учитывая, что размер структуры меньше размера integer:
Как меньше? Все битовые поля структуры в сумме занимают 4 байта. Но в принципе не суть.

Програмёр
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
class DeviceData{

  const A = 0xF;
  const B = 0xFFFF0;
  const C = 0xF00000;
  const D = 0x3000000;
  const E = 0xFC000000;

  protected $data = 0;
  function __contsruct(){}
  function __destruct(){}
  function setData($val, $mask){
    if ($mask==0) return $this->data;
    $m=0;
    $off=0;
    do{
      $off++;
      $m = ($m << 1) | 1;
    }while(($mask & $m) == 0);
    $off--;
    $this->data = ($this->data & ~$mask) | (($val >> $off) & $mask);
    return $this->data;
  }
}



В принципе за 5 минут писано... Может где ошибся, не проверял... По аналогии (только легче немного) чтение по маске... Маски предопределяем в классе (для удобства)... и всё. Вот удобный инструмент (ограничивающийся размеров integer).
Извиняюсь за нубство (я в основном системный программист и на PHP практически не писал), но можно немного пояснить код?
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38297583
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopИзвиняюсь за нубство (я в основном системный программист и на PHP практически не писал), но можно немного пояснить код?
что именно вам непонятно?
ветвление, цикл, операции арифметические,логические, битовые сдвиги...
или сам алгоритм?
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38297632
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopИзвиняюсь за нубство (я в основном системный программист и на PHP практически не писал), но можно немного пояснить код?

Хм... Ну каг бы... )) это вообще-то какраз ближе к системному программированию, чем к php (из php тут только синтаксис :) ). Я уже несколько лет в php программирую, но мне только 1 раз приходилось делать подобное. А вот как раз знаю как это делать, потому что в своё время сильно увлёкся asm'ом и за месяц перечитал кучу всякой инфы об низкоуровневой работе с памятью (и многое другое).

Алгоритм тут простой: задаём маску для каждого значения в структуре. на вход в функцию получаем число и маску. Потом определяем на сколько бит надо сместить число, которое подали (ведь, если число 0xA9, а маска 0xFF00, то в итоге наше значение должно быть записано как 0xA000). А дальше одной командой очищаем те биты в структуре, которые хотим записать, и выполняем сложение (логическое) с поданным на вход числом, смещённым и пропущенным через маску.

Думаю Вы должны понять, по какому принципу я предопределил маски, но если вдруг не понятно - пишите.

P.S. в данном случае структура меньше интежера. Тут вся штука в том, что в php тип int подразумевает (по умолчанию, как уже заметили можно и изменить) что-то подобное прикладному longint или даже int64 (не уверен... не проверял размерность никогда... 32bit вполне достаточно было). Так что в данном случае указанная структура легко поместиться в integer.
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38297655
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ведь, если число 0xA9, а маска 0xFF00, то в итоге наше значение должно быть записано как 0xA000 0xA900
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38300194
nop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, в коде разобрался :) Вроде бы работает как надо (при тестировании, проверял калькулятором), в реальных условиях пока не проверил.

ПрограмёрP.S. в данном случае структура меньше интежера. Тут вся штука в том, что в php тип int подразумевает (по умолчанию, как уже заметили можно и изменить) что-то подобное прикладному longint или даже int64 (не уверен... не проверял размерность никогда... 32bit вполне достаточно было). Так что в данном случае указанная структура легко поместиться в integer.
А вот этого понять не могу. В вашей же структуре маска 0xFC000000 смещает на последние 6 бит из 32-ух. Соответственно если я по этому смещению запишу 0x3F, то как получившееся число может получиться меньше 4ёх байт?
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38300353
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nop,

в моём сообщении "меньше" стоит понимать как "меньше или равно" :) В указанном Вами случае получится заполнение ровно 4-ёх байт.
...
Рейтинг: 0 / 0
Битовые поля в PHP
    #38301178
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nop,

Не саморекламы ради, а популяризации для:
http://pecl.php.net/package/Bitset
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Битовые поля в PHP
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]