Текущий архив: 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