Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | |
[Win32] или так: 09.04.03 14:02 Число просмотров: 1043
Автор: J'JF <Dmytro Volhushyn> Статус: Elderman
|
> Да, совершенно верно - байты бывают разные. Но, я надеюсь, > общий принцип ты уловил.
> Пример, как поменять пятый бит в байте на 1: > нужно твой байт OR с 0000100
Если так не понятно, то, возможно, для начала проще будет пойти через десятичное представление?
Имеем:
00000000 <=> 0
00000001 <=> 1
00000010 <=> 2
00000011 <=> 3
и т.д...
тогда просто получая десятичное представление байта будешь иметь представление о его содержимом и о том, какое значание он должен иметь, чтобы n-й бит был другим.
И вообще, советую изучить алгоритм перевода из десятичной в двоичную и обратно - много вопросов сразу отпадет.
|
<programming>
|
[Win32] как на delphi реализовать этот механизм 09.04.03 12:49 [ZloyShaman]
Автор: Helmet Статус: Незарегистрированный пользователь
|
Есть байт, из него нужно выдрать первые 6 битов отдельно и последние
2 бита отдельно, то-есть,
Байт: 00111110
мне нужны 001111
и 10 отдельно,мне надо из одного байта сделать два...
|
|
-> beginners 09.04.03 12:59
Автор: ZloyShaman <ZloyShaman> Статус: Elderman
|
> Есть байт, из него нужно выдрать первые 6 битов отдельно и > последние > 2 бита отдельно, то-есть, > > Байт: 00111110 > мне нужны 001111 > и 10 отдельно,мне надо из одного байта сделать два... сделай AND с 11111100 для первых 6 бит и с 00000011 для последних 2-ух.
|
| |
[Win32] Хм... 09.04.03 13:35
Автор: Helmet Статус: Незарегистрированный пользователь
|
> > Есть байт, из него нужно выдрать первые 6 битов > отдельно и > > последние > > 2 бита отдельно, то-есть, > > > > Байт: 00111110 > > мне нужны 001111 > > и 10 отдельно,мне надо из одного байта сделать два... > сделай AND с 11111100 для первых 6 бит и с 00000011 для > последних 2-ух. Байт может быть другим (разные байты)
Хорошо поставлю вопрос так :
Как мне менять определенные биты в байте,
то-есть проверить какое значение опеределенного бита и поменять его...
|
| | |
[Win32] Хм... 09.04.03 13:42
Автор: ZloyShaman <ZloyShaman> Статус: Elderman
|
> > > Есть байт, из него нужно выдрать первые 6 битов > > отдельно и > > > последние > > > 2 бита отдельно, то-есть, > > > > > > Байт: 00111110 > > > мне нужны 001111 > > > и 10 отдельно,мне надо из одного байта сделать > два... > > сделай AND с 11111100 для первых 6 бит и с 00000011 > для > > последних 2-ух. > Байт может быть другим (разные байты) Да, совершенно верно - байты бывают разные. Но, я надеюсь, общий принцип ты уловил.
> Хорошо поставлю вопрос так : > Как мне менять определенные биты в байте, > то-есть проверить какое значение опеределенного бита и > поменять его... Пример, как поменять пятый бит в байте на 1:
нужно твой байт OR с 0000100
|
| | | |
[Win32] Хм... 09.04.03 14:14
Автор: Helmet Статус: Незарегистрированный пользователь
|
Блин... Я понимаю это... Но это реально делать на asm там есть возможность работать в двоичном формате, а в Delphi, как это сделать?
К примеру может ли этот код проверить какой-то бит на 1 :
function IsBit (const val : integer; const Bit:byte):boolean;
begin
result:=(val and ( 1 shl Bit ))<>0;
end;
если да то,
я получил что 5 бит в байте равен 1, мне надо его поменять на 0,
не могу же я в delphi написать:
z:=z or 00001000;
а код
z:=z or (1 shl 4);
не меняет нифига.......
|
| | | |
[Win32] или так: 09.04.03 14:02
Автор: J'JF <Dmytro Volhushyn> Статус: Elderman
|
> Да, совершенно верно - байты бывают разные. Но, я надеюсь, > общий принцип ты уловил.
> Пример, как поменять пятый бит в байте на 1: > нужно твой байт OR с 0000100
Если так не понятно, то, возможно, для начала проще будет пойти через десятичное представление?
Имеем:
00000000 <=> 0
00000001 <=> 1
00000010 <=> 2
00000011 <=> 3
и т.д...
тогда просто получая десятичное представление байта будешь иметь представление о его содержимом и о том, какое значание он должен иметь, чтобы n-й бит был другим.
И вообще, советую изучить алгоритм перевода из десятичной в двоичную и обратно - много вопросов сразу отпадет.
|
| | | | |
[Win32] или так: 09.04.03 14:28
Автор: Helmet Статус: Незарегистрированный пользователь
|
> И вообще, советую изучить алгоритм перевода из десятичной в > двоичную и обратно - много вопросов сразу отпадет. Я прекрасно знаю эти алгоритмы и методом деления и методом возведения в степень... Не суть... Я пишу на Delphi, на асме правильно подставил маску и or сделал и все ОК, на делфи минимальная единица byte.... Я могу творить с ним логические операции, но как достучаться до опеределенного бита, у меня лажа получается... Запускаю калькулятор стандартный виндовый, смотрю число $3E после вырывания должно получиться $F, а получается у меня $3E, как и было Вот исходник:
//..............//
var
b,k,z,l:byte;
begin
b:=$3E;
showmessage(inttohex(b,2));
z:=0;
for k:=0 to 7 do
if (b and (1 shl k)) <> 0 then
z:=b or (1 shl k);
showmessage(inttohex(z,2));
//..............//
|
| | | | | |
[Win32] или так: 09.04.03 15:13
Автор: J'JF <Dmytro Volhushyn> Статус: Elderman Отредактировано 09.04.03 15:16 Количество правок: 1
|
Если хочешь получить FF, то алгоритм должен выглядеть вот так:
//..............//
var
b,k,z:byte;
begin
b:=$3E;
showmessage(inttohex(b,2));
z:=0;
for k:=0 to 7 do
if (b and (1 shl k)) = 0 then
z:=z or (b or (1 shl k));
showmessage(inttohex(z,2));
//..............//
тогда z=$FF.
просто нужно учитывать накопление битов, что мы и делаем после then,
а также правильно надо задать условие (=0, а не <>0)
|
| | | | | |
[Win32] или так: 09.04.03 15:00
Автор: FFF Статус: Незарегистрированный пользователь
|
смотрю число $3E после вырывания
> должно получиться $F, а получается у меня $3E, как и было
не очень понял про "вырывание" -- раньше шла речь о конвертации бита. А для этого надо использовать XOR, а не OR.
|
|
|