Помощь - Поиск - Пользователи - Календарь
Полная версия: Битовые операции
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Scorp_Freeman
Значит есть b:byte;
Как установить n-й бит в значение х ?

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

asm
???
???
end;
мисс_граффити
             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
Цитата(Scorp_Freeman @ 13.04.2007 19:18) *
Как установить n-й бит в значение х ?

x := x or (1 shl n);
Scorp_Freeman
Цитата

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



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

Мне нужно будет в байт к примеру ???????? на место второго бита поставить сооветствующий бит
другого байта 000000?0. Если бы у меня второй байт был 111111?1 я бы просто использовал AND (
hardcase
Цитата(Scorp_Freeman @ 13.04.2007 19:53) *

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

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

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

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

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


Извените, я кажется ошибся в формулировке вопроса) "Установить" не в смысле записать 1 а поместить туда значение бита(0 либо 1)
hardcase
Цитата(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
Цитата(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
Цитата(hardcase @ 13.04.2007 18:57) *

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


если так написать,как мне кажется, то тогда в первом байте изменяется не только тот бит который мне надо, а и другие , значение которых должно быть неизменным
мисс_граффити
сорри... не удержалась.
bit:byte
good.gif
hardcase
Нда пока редактил решение, тут уже всё ответили =))
Scorp_Freeman
спасибо !!! blum.gif раздуплил наконец то ))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.