Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];

Вниз

Задачка для мозгов   Найти похожие ветки 

 
Ega23 ©   (2005-06-28 14:37) [0]

Тут с коллегой заспорили, можно ли сделать следующее:

Есть функция (или процедура с var параметром), которая устанавливает в числе определённый бит в 0 или 1.
Прототип такой:

function SetBit(const aValue:Cardinal; const BitNumber:Byte;
               const BitValue:Boolean):Cardinal;
begin
Result:=...;
end;

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


 
КаПиБаРа ©   (2005-06-28 14:40) [1]

можно


 
Ega23 ©   (2005-06-28 14:41) [2]

А как?  :о)


 
КаПиБаРа ©   (2005-06-28 14:44) [3]

Массив из 32/64 чисел + and/or


 
Игорь Шевченко ©   (2005-06-28 14:44) [4]


> Фишка вся в том, чтобы сделать установку бита одной строчкой


Result := ((aValue and (not (1 shl BitNumber))) or (ord(BitValue) shl BitNumber)) ?


 
Игорь Шевченко ©   (2005-06-28 14:47) [5]

Вместо Ord(BitValue) следует читать (Ord(BitValue) and 1)


 
BiN ©   (2005-06-28 15:06) [6]

Игорь Шевченко ©   (28.06.05 14:47) [5]

Вместо Ord(BitValue) следует читать (Ord(BitValue) and 1)


А разве одно другому для Boolean не равно?


 
Kerk ©   (2005-06-28 15:10) [7]

BiN ©   (28.06.05 15:06) [6]
А разве одно другому для Boolean не равно?


В общем случае - нет.


 
Игорь Шевченко ©   (2005-06-28 15:16) [8]

BiN ©   (28.06.05 15:06) [6]

Я предпочитаю дуть на воду после того, как обжегся на Nls-функциях WinAPI, куда true передавалось, как $FFFFFFFF :)

С уважением,


 
Digitman ©   (2005-06-28 15:21) [9]


> Есть функция (или процедура с var параметром),


> function SetBit(const aValue:Cardinal;...


"Как понимать тебя, Саид ?"(с)


 
Kerk ©   (2005-06-28 15:23) [10]

Digitman ©   (28.06.05 15:21) [9]

Слово "или" видишь? :)


 
Digitman ©   (2005-06-28 15:27) [11]


> Kerk ©   (28.06.05 15:23) [10]


прототип для функции видишь ?
функция - с параметрами)


 
Kerk ©   (2005-06-28 15:43) [12]

Digitman ©   (28.06.05 15:27) [11]
функция - с параметрами)


Функция. Но не процедура с var-параметром.
Или-или. :)


 
Digitman ©   (2005-06-28 15:49) [13]


> Kerk ©   (28.06.05 15:43) [12]


Дурью ведь маешься, Роман)

Ежу понятно, что в закрывающая скобка не на месте (д.б. стоять после слова "процедура")


 
BiN ©   (2005-06-28 15:53) [14]

Игорь Шевченко ©   (28.06.05 15:16) [8]

BiN ©   (28.06.05 15:06) [6]

Я предпочитаю дуть на воду после того, как обжегся на Nls-функциях WinAPI, куда true передавалось, как $FFFFFFFF :)


С этим-то всё понятно, но ведь речь здесь идет о Ord(Boolean), а не о Boolean, т.е. о порядковом номере значения в ряде: [False, True]


 
Игорь Шевченко ©   (2005-06-28 15:59) [15]

BiN ©   (28.06.05 15:53) [14]

А...понял. Значит, перестраховался :)


 
Nous Mellon ©   (2005-06-28 16:05) [16]


> Ежу понятно, что в закрывающая скобка не на месте (д.б.
> стоять после слова "процедура")

Отлично! ;)


 
Ega23 ©   (2005-06-28 18:00) [17]

2 Digitman ©   (28.06.05 15:49) [13]
Ежу понятно, что в закрывающая скобка не на месте (д.б. стоять после слова "процедура")

Раз 10 перечитал и так итак. Вроде, без разницы...  ?


 
jack128 ©   (2005-06-28 21:34) [18]

Kerk ©   (28.06.05 15:10) [7]
В общем случае - нет.

не знаю как для остальных версий, а для d7 - это одно и тоже. По крайней мере Борланд так говорит.

BiN ©   (28.06.05 15:53) [14]
т.е. о порядковом номере значения в ряде: [False, True]

ну например

type
 TEnum = (en1 = 1, en10 = 10);

procedure TForm1.Button1Click(Sender: TObject);
begin
 caption := inttostr(ord(en10))
end;

?


 
BiN ©   (2005-06-28 22:07) [19]

jack128 ©   (28.06.05 21:34) [18]

BiN ©   (28.06.05 15:53) [14]
...
type
TEnum = (en1 = 1, en10 = 10);
...
?


Про енумераторы же (можно я их так буду называть? -)) с явно заданным порядком элементов очень доходчиво вещает все та же справка Delph (7), согласно которой твой TEnum - состоит из 10, а не из 2-х элементов с именами

X: array [TEnum] of char;
caption:=SizeOf(X)


т.е. порядковый номер en10 равен именно 10.

Все это никак не влияет на наш случай. К тому же я бы не стал на месте автора использовать тип Буля, Byte как-то спокойнее.



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

Форум: "Потрепаться";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.033 c
3-1118144276
Juice
2005-06-07 15:37
2005.07.18
Обработка ошибок - код


14-1119966914
pavel_guzhanov
2005-06-28 17:55
2005.07.18
Что такое система контроля версий?


1-1120022379
Лёха
2005-06-29 09:19
2005.07.18
Эффекты в компонентах.


1-1119970429
MuxauJl
2005-06-28 18:53
2005.07.18
Программа не хочет вырубаться


3-1117799689
GekaNaz
2005-06-03 15:54
2005.07.18
MySQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский