Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Битовые операции

Автор: Scorp_Freeman 13.04.2007 22:18

Значит есть b:byte;
Как установить n-й бит в значение х ?

Либо какими командами ассемблера это можно сделать ?

asm
???
???
end;

Автор: мисс_граффити 13.04.2007 22:38

             asm
mov AL,f
or c,AL
end;


             asm
mov AL,f
and c,AL
end;

смотря чему равен х...

то есть, например, 110 and 011 даст 010 (установили первый бит в 0)
001 or 101 даст 101 (установили первый в 1)

Автор: hardcase 13.04.2007 22:49

Цитата(Scorp_Freeman @ 13.04.2007 19:18) *
Как установить n-й бит в значение х ?

x := x or (1 shl n);

Автор: Scorp_Freeman 13.04.2007 22:53

Цитата

смотря чему равен х...



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

Мне нужно будет в байт к примеру ???????? на место второго бита поставить сооветствующий бит
другого байта 000000?0. Если бы у меня второй байт был 111111?1 я бы просто использовал AND (

Автор: hardcase 13.04.2007 22:57

Цитата(Scorp_Freeman @ 13.04.2007 19:53) *

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

Мне нужно будет в байт к примеру ???????? на место второго бита поставить сооветствующий бит
другого байта 000000?0. Если бы у меня второй байт был 111111?1 я бы просто использовал AND (

b1 := b1 or (b2 and (1 shl n))

добавил: у меня биты нумеруются с нуля.

Автор: Scorp_Freeman 13.04.2007 22:59

Цитата

Как установить n-й бит в значение х ?


Извените, я кажется ошибся в формулировке вопроса) "Установить" не в смысле записать 1 а поместить туда значение бита(0 либо 1)

Автор: hardcase 13.04.2007 23:01

Цитата(Scorp_Freeman @ 13.04.2007 19:59) *


Извените, я кажется ошибся в формулировке вопроса) "Установить" не в смысле записать 1 а поместить туда значение бита(0 либо 1)


Однако переклинило......

mask := (1 shl n);
bit := (b2 and mask);
if( boolean(bit) ) then b1 := b1 or mask;
else b1 := b1 and not mask;

Автор: hiv 13.04.2007 23:03

Цитата(hardcase @ 13.04.2007 19:57) *
у меня биты нумеруются с нуля.
И у меня с нуля lol.gif
procedure changebit(var x:byte;n:byte;bit:byte);
begin
if bit=0 then x:=x and (not(1 shl n))
else x:=x or (1 shl n)
end;

var bb:byte;

begin
bb:=133;
changebit(bb,2,0);
writeln(ord(bb));
end.


x - исходная переменная
n - номер бита
bit - во что устанавливаем 0 / 1

Автор: Scorp_Freeman 13.04.2007 23:04

Цитата(hardcase @ 13.04.2007 18:57) *

b1 := b1 or (b2 and (1 shl n))


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

Автор: мисс_граффити 13.04.2007 23:05

сорри... не удержалась.

bit:byte
good.gif

Автор: hardcase 13.04.2007 23:10

Нда пока редактил решение, тут уже всё ответили =))

Автор: Scorp_Freeman 13.04.2007 23:16

спасибо !!! blum.gif раздуплил наконец то ))