Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.23;
Скачать: CL | DM;

Вниз

Ещё один пример нестандартного мЫшления некоторых "кодеров"   Найти похожие ветки 

 
Германн ©   (2008-02-11 01:43) [0]

Делаю некий прибамбас для улучшения функциональности некоей программы. Сама программа давно готова и продается уже несколько лет. Полез в её исходники чтобы понять в каком виде программа сохраняет в базе данных "некие битовые маски". (Эти маски - суть набор битов, который используется для выбора режимов работы моего контроллера). Увидел в коде программы набор неких констант, нашел их описания:
//Rflags
  fRegXXX  = 1 shl 0;
  fRegYYY    = (1 shl 1) or (1 shl 2);
  fRegZZZ     = 1 shl 31;
  fRegXYZ    = 1 shl 3;

(X,Y,Z - мои замены реальным и вполне понятным именам констант)
Но вот видел ли кто из вас такой способ записи констант для битовых масок? Хоть в VCL, хоть в WinAPI, хоть ещё где?
P.S. И самое мне непонятное. Ведь автора не упрекнешь в полном незнании битовой арифметики.


 
ketmar ©   (2008-02-11 01:54) [1]

я видел. хоть ещё где: в своём коде. потому что я ленивый, и раскладывать шестнадцатириячное число, чтобы выяснить, что в нём стоит в 1 иемнно 13-й бит, а не 12-й или 14-й — лень.

---
Understanding is not required. Only obedience.


 
Jack128_   (2008-02-11 02:00) [2]

>>Но вот видел ли кто из вас такой способ записи констант для битовых >>масок? Хоть в VCL, хоть в WinAPI, хоть ещё где?

В VCL для масок используют set"ы.


 
sniknik ©   (2008-02-11 02:02) [3]

unit Windows;
...
 LANG_NEUTRAL                         = $00;
...
 SUBLANG_DEFAULT                      = $01;    { user default }
...

{ Default System and User IDs for language and locale. }

 LANG_SYSTEM_DEFAULT   = (SUBLANG_SYS_DEFAULT shl 10) or LANG_NEUTRAL;
 {$EXTERNALSYM LANG_SYSTEM_DEFAULT}
 LANG_USER_DEFAULT     = (SUBLANG_DEFAULT shl 10) or LANG_NEUTRAL;
 {$EXTERNALSYM LANG_USER_DEFAULT}

 LOCALE_SYSTEM_DEFAULT = (SORT_DEFAULT shl 16) or LANG_SYSTEM_DEFAULT;
 {$EXTERNALSYM LOCALE_SYSTEM_DEFAULT}
 LOCALE_USER_DEFAULT   = (SORT_DEFAULT shl 16) or LANG_USER_DEFAULT;
 {$EXTERNALSYM LOCALE_USER_DEFAULT}
...

самая "забавная" строчка подчеркнута.


 
Германн ©   (2008-02-11 02:20) [4]


> Jack128_   (11.02.08 02:00) [2]
>
> >>Но вот видел ли кто из вас такой способ записи констант
> для битовых >>масок? Хоть в VCL, хоть в WinAPI, хоть ещё
> где?
>
> В VCL для масок используют set"ы.
>

Не понял. Поясни, Жень что ты имел в виду.

Не, Коль. Это забавно только на первый (поверхностный взгляд).
Твои примеры хоть и не понятны, но понятны :)
В них для формирования битовых масок используются  не "жёсткие" константы.


 
Германн ©   (2008-02-11 02:34) [5]


> ketmar ©   (11.02.08 01:54) [1]

Хотя. Возможно ты прав, Dark. Ведь описание "набора битов" этот кодер получил в виде;
БайтNN:
 Бит0 - ..
 Бит1 -...
и т.д.

Хотя 16-2 и 2-16 преобразования я делаю автоматически в уме. Но я - это я, А никто другой и не обязан, имхо.


 
ketmar ©   (2008-02-11 02:41) [6]

>[5] Германн © (2008-02-11 02:34:00)
>Хотя 16–2 и 2–16 преобразования я делаю автоматически в уме

я тоже. а вот считать биты в уме мне сложно. и с ходу как раз прочесь/сгенерить такое число мне трудно: сначала надо представить его написаным, потом по картинке подсчитать биты.

---
Understanding is not required. Only obedience.


 
Германн ©   (2008-02-11 02:48) [7]


> ketmar ©   (11.02.08 02:41) [6]

Мне проще. Именно это я и имел в виду в [5]. У меня всё это автоматом.


 
ketmar ©   (2008-02-11 02:55) [8]

>[7] Германн © (2008-02-11 02:48:00)
ну да. битов немного, можно запомнить. %-)

---
Understanding is not required. Only obedience.


 
Германн ©   (2008-02-11 03:19) [9]


> ketmar ©   (11.02.08 02:55) [8]

Твою "отмазку" я принял. В "Прочее" она годится.


 
_Mike_   (2008-02-11 04:08) [10]


> хоть в WinAPI

Открой Winsock2.h и удивись


 
atruhin ©   (2008-02-11 05:51) [11]

Я примерно так же задаю. Считаю что это самый понятный способ.


 
ага   (2008-02-11 06:04) [12]


>Но вот видел ли кто из вас такой способ записи констант для битовых масок?

Сам иногда так делаю. Видать привычка из CodeVisionAVR - там это ваще практически стандарт. А чем плоха запись? Без дополнительной напруги сразу видать, какой бит ставится. Нагляднее, чем 8, 32, 256. И даже чем $9, $20, $80, тем более чем $A0 etc


 
Sandman25   (2008-02-11 09:09) [13]

Нормальное мышление. Мышление человека, который отлично понимает, что компилятор сам посчитает константу на этапе компиляции.
Еще в том же стиле:
const
 SECONDS_IN_DAY = 60 * 60 * 24;
неужели лучше, по-Вашему, писать сразу 86400???


 
Mystic ©   (2008-02-11 09:22) [14]

> У меня всё это автоматом.

Когда сдвиг идет на 1, 2 или 3, у меня это тоже автоматом. Но когда сдвиг на 31, меня просто ломает считать набираемые нули.

А в целом, имхо, это вопрос вкуса.


 
Mystic ©   (2008-02-11 09:29) [15]

Кстати, как по мне, один из самых лучших способов записи числовых констант в языке Ada. Там числовые литералы могут начинаться с символа подчеркивания (однако не могут начинаться с символа подчеркивания а также содержать два и более символа подчеркивания подряд. Может это уже менее удобно, но также можно задавать систему счисления, а потом через # само число. Например, так:

1_024
2#1010_1100_0001_1110#
1_000_000_000


 
Johnmen ©   (2008-02-11 09:40) [16]


> Германн ©   (11.02.08 01:43) 

Нахожу это нормальным и даже полезным.
Автор подчеркнул битовость и напомнил себе о выставленных.


 
Правильный_Вася   (2008-02-11 10:52) [17]


> Там числовые литералы могут начинаться с символа подчеркивания
> (однако не могут начинаться с символа подчеркивания

не понял


 
KilkennyCat ©   (2008-02-11 11:09) [18]

> [16] Johnmen ©   (11.02.08 09:40)

То есть, практически вложил в два раза больше информации.


 
Marser ©   (2008-02-11 11:11) [19]

А в чём глубинный смысл 1 shl 0  ?

К другому претензий нету, хотя мне для констант в пределах первого байта
всё же привычнее использовать HEX в частности степени двойки по отдельности (1,2,4,8,10,20,40,80), чем громоздкая запись с помощью сдвиговых операторов, которая, хотя и понятна сразу, но годится больше для побитового обхода в цикле...


 
Johnmen ©   (2008-02-11 11:21) [20]


> KilkennyCat ©   (11.02.08 11:09) [18]

Не так.
Все в одном флаконе.


 
Правильный_Вася   (2008-02-11 11:22) [21]


> А в чём глубинный смысл 1 shl 0  ?

наверно, в единстве формы представления


 
Johnmen ©   (2008-02-11 11:22) [22]


> Marser ©   (11.02.08 11:11) [19]
> А в чём глубинный смысл 1 shl 0  ?

[16]


 
Marser ©   (2008-02-11 11:24) [23]


> Johnmen ©   (11.02.08 11:22) [22]
> > Marser ©   (11.02.08 11:11) [19]> А в чём глубинный смысл
> 1 shl 0  ?[16]

Т.е., по умолчанию на единицу глядят, как на ночной кошмар школьных лет, а не выставленный нулевой бит, это вы хотите сказать?


 
Johnmen ©   (2008-02-11 11:34) [24]


> Marser ©   (11.02.08 11:24) [23]

Не знаю, кто как глядит, но лично я на a = 1 гляжу, как на целочисленную константу.


 
Anatoly Podgoretsky ©   (2008-02-11 12:10) [25]

> sniknik  (11.02.2008 02:02:03)  [3]

А что в ней тебя неустраивает?
shl или LANG_NEUTRAL

На мой взгляд как раз профессионально, если знать устройство LANG и соблюсти единство стиля, ведь на производительность это никак не влияет.


 
DiamondShark ©   (2008-02-11 12:15) [26]


> Marser ©   (11.02.08 11:11) [19]
> А в чём глубинный смысл 1 shl 0  ?

В единообразии.


 
Marser ©   (2008-02-11 12:23) [27]

Ну, в общем, да. Когда-то я плевался при виде сочетания #$ а сейчас сам применяю, так читается легче, если смысл байта в HEX яснее...


 
Sandman25   (2008-02-11 12:24) [28]

Единообразие рулит :)
const
 A = 1 shl -1; // 0
Только непонятно, почему нулевой бит называют нулевым, а не "минус-первым" :)


 
Marser ©   (2008-02-11 12:26) [29]


> Sandman25   (11.02.08 12:24) [28]
> Единообразие рулит :)const   A = 1 shl -1; // 0Только непонятно,
>  почему нулевой бит называют нулевым, а не "минус-первым"
> :)

Потому что 1 = 2^0


 
Johnmen ©   (2008-02-11 12:46) [30]


> Sandman25   (11.02.08 12:24) [28]
> const   A = 1 shl -1; // 0

Ты считаешь, что это нулевой бит???


 
Sandman25   (2008-02-11 12:56) [31]

Marser ©   (11.02.08 12:26) [29]

Значит, вместо 1 shl 5 правильнее писать 2 shl 4.


 
Anatoly Podgoretsky ©   (2008-02-11 12:58) [32]

> Marser  (11.02.2008 12:26:29)  [29]

Скажу больше

M^0 = 1

http://www.podgoretsky.com/cgi-bin/dlcounter/npscnt?file=http://podgoretsky.com/ftp/Docs/Delphi/Podgoretsky/bits.html&file_id=app-bits


 
Sandman25   (2008-02-11 13:03) [33]

Johnmen ©   (11.02.08 12:46) [30]

Да я уже запутался. То 1, то 2 в качестве основания. То нулевой, то первый. Именовали бы просто - крайний справа, следующий за крайним справа :)


 
Anatoly Podgoretsky ©   (2008-02-11 14:24) [34]

> Sandman25  (11.02.2008 13:03:33)  [33]

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


 
Marser ©   (2008-02-11 14:29) [35]

А зачем нумерация? Какой в ней глубинный смысл? Как её рапространить на представление дробных чисел?


 
Mystic ©   (2008-02-11 15:39) [36]

> Скажу больше
>
> M^0 = 1


M <> 1, M <> 0

> Да я уже запутался. То 1, то 2 в качестве основания. То
> нулевой, то первый. Именовали бы просто - крайний справа,
>  следующий за крайним справа :)


Лучше на код смотреть :) Там все тривиально. Самое сложных трюк с битами, который я видел, это:


static const FLD LSB_Magic[64] =
{
  A8, B4, E1, H5, E8, B2, E2, G5,
  D8, H4, F7, G2, A7, E3, C3, F5,
  C8, C4, F1, C7, E7, A3, G6, F3,
  H8, D4, G1, E6, B6, E4, H1, E5,
  B8, A4, F8, D1, C1, G7, B7, B1,
  A2, D7, D2, H6, A1, F6, C6, H3,
  G4, G8, H7, C2, F2, A5, H2, D6,
  D3, A6, B5, B3, G3, C5, D5, F4
};

static inline FLD pop_lsb_inner(U64* pb)
{
  if (*pb == 0)
     return NF;

  U64 lsb = *pb ^ (*pb - 1);
  unsigned int foldedLSB = ((int) lsb) ^ ((int)(lsb>>32));
  int ind = (foldedLSB * 0x78291ACF) >> (32-6); // range is 0..63

  *pb &= ~lsb;
  return LSB_Magic[ind];
}


 
ketmar ©   (2008-02-11 16:13) [37]

>[36] Mystic © (2008-02-11 15:39:00)
даже разибраться не стал: страшно.

---
Understanding is not required. Only obedience.


 
sniknik ©   (2008-02-11 16:19) [38]

Anatoly Podgoretsky ©   (11.02.08 12:10) [25]
>> sniknik  (11.02.2008 02:02:03)  [3]
> А что в ней тебя неустраивает?
меня все устраивает, все в общем стиле, просто если заменить константы на непосредственно цифры получим практически тоже, похожее, что и в [0]. ->
LANG_USER_DEFAULT = (1 shl 10) or 0;


 
sniknik ©   (2008-02-11 16:22) [39]

т.е. это
> пример нестандартного мЫшления некоторых "кодеров"
по сабжу.


 
Anatoly Podgoretsky ©   (2008-02-11 16:52) [40]

> sniknik  (11.02.2008 16:19:38)  [38]

Скажу еще больше - не надо константы менять на жесткое значение, они используются для изменения в одном месте, а не в сотне.
А то что or 0 - так скажено для единства стиля и это ничего не стоит.



Страницы: 1 2 вся ветка

Текущий архив: 2008.03.23;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.019 c
2-1203682299
Gauss
2008-02-22 15:11
2008.03.23
Что-то вроде транслитератора.


2-1203691244
San1
2008-02-22 17:40
2008.03.23
наследование свойства OnMouseMove


2-1204118362
Ultimate
2008-02-27 16:19
2008.03.23
Вопрос про 2 формы...


15-1202636826
@!!ex
2008-02-10 12:47
2008.03.23
Что за группа? Что за трэк?


2-1204014098
dracula
2008-02-26 11:21
2008.03.23
ReadFile и юникод