Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > записать в 1-й бит 1-го байта значение 1?


Автор: JS2 9.2.2010, 15:13
имеется переменная типа запись
Код

  TBlock1 = record
    Offset, Length: Integer;
  end;

  Block1: TBlock1;


  Как записать в 1-й бит 1-го байта значение 1?
  

Автор: Frees 9.2.2010, 15:29
как то так
Код

var x: Byte;
.... 
 Move(b, x, 1);
  x := x or 128;
  Move(x, b, 1);



Автор: JS2 9.2.2010, 15:33
а почему 128

Автор: Frees 9.2.2010, 15:46
Цитата(JS2 @  9.2.2010,  18:33 Найти цитируемый пост)
128

это 10000000 в bin тебе надо первый бит сделать единицей остальные будут неизменны

Автор: kami 9.2.2010, 15:48
Цитата(JS2 @  9.2.2010,  15:33 Найти цитируемый пост)
а почему 128

Да, почему?
Ведь первый бит первого байта =2 (если считать правильно, с нуля).
Цитата(JS2 @  9.2.2010,  15:13 Найти цитируемый пост)
Как записать в 1-й бит 1-го байта значение 1?

В первый байт Offset, Length или чего?

Автор: Frees 9.2.2010, 15:51
Цитата(kami @  9.2.2010,  18:48 Найти цитируемый пост)
Ведь первый бит первого байта =2 (если считать правильно, с нуля).

ага точно 
тогда 64

Автор: kami 9.2.2010, 15:58
Цитата(Frees @  9.2.2010,  15:51 Найти цитируемый пост)
тогда 64

Почему 64?
128 - это седьмой бит, установленный в единицу.
64 - шестой
32 - пятый
16 - четвертый
8 - третий
4 - второй
2 - первый
1 - нулевой.

И устанавливается (myValue:integer) 
myValue:=myValue or 2, не нужно никаких Move... smile или я чего-то не понимаю?

Автор: Frees 9.2.2010, 16:01
kami, почему то мне кажется что ты не с того края посчитал

байт
10000000 - 128 нулевой
01000000 - 64 первый

где я не прав?

Добавлено через 4 минуты и 24 секунды
Цитата(kami @  9.2.2010,  18:58 Найти цитируемый пост)
myValue:=myValue or 2, не нужно никаких Move... smile или я чего-то не понимаю?


дак у него рекорд а не интеджер, можно конечно Block1.Offset := Block1.Offset or ..хз. но это может сломаться елсли изменить структуру

Автор: kami 9.2.2010, 16:17
Цитата(Frees @  9.2.2010,  16:01 Найти цитируемый пост)
где я не прав?

биты в байте нумеруются справа налево. Это же касается и байтов в словах.
http://www.podgoretsky.com/ftp/Docs/Asm/AsmBradly/2/2-8.html

Автор: Mikel 9.2.2010, 16:26
Наверное что-то типа этого, проверьте, писал без компилятора. n- номер бита.

Код

procedure SetBit(var b:TBlock1;n:integer);
var tmp:PByte;
begin
tmp:=PByte(LongWord(@b)+n div 8)^;
tmp^:=tmp^ or (1 shl (n mod 8));
end;

Автор: profesiachuvak 9.2.2010, 18:32
Цитата(Frees @  9.2.2010,  16:01 Найти цитируемый пост)
kami, почему то мне кажется что ты не с того края посчитал

байт
10000000 - 128 нулевой
01000000 - 64 первый

где я не прав?


Я тоже поддакнуть хочу: 

kami, прав. 
Вот эта запись 10000000 говорит о том что у нас 7-ой бит. 2^7 = 128.
Нужно вот так: 00000001 вот это уже 2^0=1 нулевой
Ну а первый соответсвенно 2^1 (0000010). 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)