![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите узнать какие биты, выловлены, а какие нет?
NikNet © (2005-08-21 13:40:00)Помогите узнать какие биты, выловлены, а какие нет?
Например, скопировать узнать 0..7 из WORD и т. д.
Может, есть готовая ф-ция?
Германн (2005-08-23 03:02:00) [1]Имхо, может я и не прав, но позволю себе напомнить о "Помогите узнать какие биты, выловлены, а какие нет" с помощью конструкции Set
Если только номер бита не вылазит за 32! А по сабжу - Нет!
Тогда, имхо, лучше описать свой тип - Set! И проверять вхождение в него.
Defunct (2005-08-22 19:49:00) [2]begin...end © (22.08.05 19:40) [22]
Удобство заключается в использования номера бита в отличие от [3] (вы наверняка заметили, что пост [5] появился до поста [9]). А преимущество посравнению с shr [9] в скорости исполнения.
begin...end (2005-08-22 19:40:00) [3]> Defunct © (22.08.05 19:33) [21]
А в чём удобствоспособа [5]? Гораздо удобнее, по-моему, обычный shl/and или [9]. Хотя это и будет несколько медленнее работать.
Defunct (2005-08-22 19:33:00) [4]begin...end © (22.08.05 19:24) [20]
А оно надо брасаться такими фразами: [8]
их весьма неприятно читать.
begin...end (2005-08-22 19:24:00) [5]> Defunct © (22.08.05 19:16) [18]
Ну откомпилируется, но с warning'ом. А оно надо?
vrem (2005-08-22 19:17:00) [6][16] begin...end © (22.08.05 19:14)
а если использовать отрицательное integer, что бы по битам совпало с $80000000 ?
Defunct (2005-08-22 19:16:00) [7]begin...end © (22.08.05 19:14) [16]
> Нет, я считаю, что объявление массива mskAnd из [5] не откомпилируется
ты ошибаешься.
Defunct (2005-08-22 19:16:00) [8]> begin...end
<> вместо >
begin...end (2005-08-22 19:14:00) [9]> Defunct © (22.08.05 19:10) [15]
Нет, я считаю, что объявление массива mskAnd из [5] не откомпилируется, по крайней мере, до тех пор, пока из списка его элементов не убрать $80000000, или не изменить тип на четырёхбайтовый беззнаковый.
Что ж, Вам никто не мешает убедиться в этом самостоятельно.
Defunct (2005-08-22 19:10:00) [10]begin...end © (22.08.05 19:04) [14]
А ты об этом, т.е. ты считаешь что знаковый разряд не будет работать. Что ж тебе никто не мешает убедиться в обратном.
begin...end (2005-08-22 19:04:00) [11]> Defunct © (22.08.05 18:58) [13]
> Каких?
Диапазона значений типа Integer.
Defunct (2005-08-22 18:58:00) [12]Удалено модератором
begin...end (2005-08-22 17:22:00) [13]Удалено модератором
Defunct (2005-08-22 16:42:00) [14]Удалено модератором
Германн (2005-08-22 16:00:00) [15]2 Defunct © (22.08.05 04:03) [7]
> в delphi нет test.
Test нет, зато есть in
tesseract (2005-08-22 09:38:00) [16]По мне так проще:
Функция установлен ли бит (номер бита с конца)
Function IsBitSet(value:cardinal; bitno:byte):boolean;
begin
result:=odd(value shr bitno);
end;
перефазировка на номер бита от начала делается так
BitFirst:=SizeOF(cardinal)-bitno;
begin...end (2005-08-22 08:16:00) [17]> Defunct © (21.08.05 20:50) [5]
> так imho удобнее: ...
Так не может быть удобнее, потому что так даже не откомпилируется.
Defunct (2005-08-22 04:03:00) [18]Германн © (22.08.05 03:41) [6]
в delphi нет test.
Германн (2005-08-22 03:41:00) [19]Не снимая вопроса
"Anatoly Podgoretsky © (21.08.05 13:43) [1]"
"Кто выловил и как выловил."
позвольте возразить, что TEST - быстрее AND!
Defunct (2005-08-21 20:50:00) [20]KilkennyCat © (21.08.05 17:17) [3]
Это сложно ;)
надо всегда помнить степени двойки ;>
так imho удобнее:
const
mskAnd : array[0..31] of integer =
(1, 2, 4, 8, 16 ...., $80000000);
mskOr : array[0..31] of integer =
($FFFFFFFE, $FFFFFFFD, ...., $7FFFFFFF );
function GetBit(const Num, Slovo : integer):boolean;
begin
Result := Slovo and mskAnd[ Num ] > 0;
end;