Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

Преобразование BYTE to BIN   Найти похожие ветки 

 
Fast   (2004-04-15 14:52) [0]

Как проще всего из байта получить битовую маску в виде строки?


 
Тимохов ©   (2004-04-15 14:55) [1]

проще всего посмотреть историю за 2 дня - вопрос был


 
Alx2 ©   (2004-04-15 14:56) [2]

Проще всего - по таблице из 256 элементов.

А лучше - с помощью операций сдвига и логических.


 
Digitman ©   (2004-04-15 14:57) [3]

сдвигай в цикле свой байт 8 раз влево ... если выдвинутый бит равен 1, добавляй в результ.строку "1", иначе - "0"

куда уж проще


 
Тимохов ©   (2004-04-15 14:59) [4]


> Fast   (15.04.04 14:52)  

виноват, что в историю послал - там другой вопрос (наздавание просто схожее).

в общем то согласен с предыдущими ораторами


 
Fast   (2004-04-15 15:01) [5]

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


 
TUser ©   (2004-04-15 15:02) [6]

var b:byte; i:integer;
   s:=string;
begin
s:="";
for i:=1 to 8 do begin
  s:=inttostr(b mod 2)+s;
  b:=b div 2;
  end;
end;

Типа обычный алгоритм - как записать число в N-ричной системе.


 
Alx2 ©   (2004-04-15 15:14) [7]

Как вариант - с таблицей.

function ToBinStr(B : Byte):String;
Const
 Templates : array [0..3] of String[2]=
  ("00","01","10","11");
begin
Result :=
          Templates[(B shr 6) and 3]+
          Templates[(B shr 4) and 3]+
          Templates[(B shr 2) and 3]+
          Templates[B and 3];
end;


 
Ega23 ©   (2004-04-15 15:18) [8]

for i:=1 to 8 do if ((N shr i) and 1)=1 then s:=s+"1" else s:=s+"0";


 
Anatoly Podgoretsky ©   (2004-04-15 15:28) [9]

Ega23 ©   (15.04.04 15:18) [8]
А нулевой бит Пушкин будет обрабатывать?
И почему слева направо, обычно наоборот,


 
Тимохов ©   (2004-04-15 15:34) [10]


> Ega23 ©   (15.04.04 15:18) [8]

так то
тут палец в рот не клади - в миг откусят :)))))


 
Ega23 ©   (2004-04-15 15:35) [11]

Сорри, ошибочка вышла....

for i:=7 downto 0  do if ((N shr i) and 1)=1 then ss:=ss+"1" else ss:=ss+"0";


 
Fast   (2004-04-15 15:36) [12]

Ну если поколения понадобиться то вот с иправлениями :)

var
 Full_bit = "1";
 Empty_bit = "0";
 i:integer;
 s:string;
begin
for i:=0 to 7 do
if ((b shr i) and 1)=1
  then s:=Full_bit+s
  else s:=Empty_bit+s;
end;


 
WebErr ©   (2004-04-15 15:44) [13]


> Ega23 ©   (15.04.04 15:35) [11]

Ну почему же ошибочка?! :)

// some byte N
S := "";
for i := 1 to 8 do
begin
 case (N and $80) of
   0:   S := S + "0";
   $80: S := S + "1";
 end;
 N := N shr 1;
end;

Господи! В С++ гораздо проще работать с битами!!! :))))

for(i=0; i<8; i++, n>>=1)
 strcat(s, ((n & 0x80) ? "1" : "0"));

:))))


 
TUser ©   (2004-04-15 15:46) [14]

В Си++ гораздо проще работать с битами и указателями, зато там отнюдь не проще рабоать со всем остальным ...


 
Тимохов ©   (2004-04-15 15:46) [15]


> Господи!

какое отношение творец имеет к c++?

в дельфи вам никтно не мешает приведенную функцию также вытянуть в две строки, можно даже в одну.


 
WebErr ©   (2004-04-15 15:47) [16]


> TUser ©   (15.04.04 15:02) [6]
> var b:byte; i:integer;
>    s:=string;
> begin
> s:="";
> for i:=1 to 8 do begin
>   s:=inttostr(b mod 2)+s;
>   b:=b div 2;
>   end;
> end;
>
> Типа обычный алгоритм - как записать число в N-ричной системе.

Это что ещё за b mod 2 и b div 2
Ещё раз увижу - руки оторву!!!


 
Тимохов ©   (2004-04-15 15:48) [17]


> Это что ещё за b mod 2 и b div 2
> Ещё раз увижу - руки оторву!!!

почему?


 
Alx2 ©   (2004-04-15 15:48) [18]

>WebErr ©   (15.04.04 15:47) [16]
В asm-коде оптимизатор превратит это в shr и and


 
WebErr ©   (2004-04-15 15:50) [19]


> WebErr ©   (15.04.04 15:44) [13]

Вот ты брат и ошибся!!!
$80 тоже надо двигать вправо вместе с числом!!!


 
Тимохов ©   (2004-04-15 15:50) [20]


> WebErr ©   (15.04.04 15:47) [16]

не верите 18, проверьте сами.
ручки человеку еще пригодятся


 
TUser ©   (2004-04-15 15:50) [21]

Не понял ...


 
WebErr ©   (2004-04-15 15:53) [22]


> TUser ©   (15.04.04 15:50) [21]

b div 2 ~ b shr 1
b mod 2 ~ b and 1
Читаемость у новичков сразу теряется, но появляется уверенность, что асм-анализатору не придётся делать пару лишних процедур!
Люди, берегите оптимизатор, не загружайте его работой, он был создан, чтобы радоваться жизни, а не работать!!! :))))


 
TUser ©   (2004-04-15 15:54) [23]

Пишите сразу на асме, дабы он жизни раовался


 
WebErr ©   (2004-04-15 15:56) [24]


mov a, b
shr a, 1
mov c, b
and c, 1

:))))


 
WebErr ©   (2004-04-15 16:04) [25]


> WebErr ©   (15.04.04 15:44) [13]

Не, брат, прости - не могу я спокойно на твои ошибки смотреть!!! :))))

procedure ByteToBin(Value: Byte): String;
var
 I, One: Byte;
begin
 Result := "";
 One := $80;
 for I := 1 to 8 do
 begin
   if Value and One = 0 then
     Result := Result + "0"
   else
     Result := Result + "1";
   One := One shr 1;
   {
   asm
   begin
     shr One, 1
   end;
   }
 end;
end;

Эх! А на С++ всё равно лучше получается!!! :))))


 
WebErr ©   (2004-04-15 16:13) [26]

Очень прошу не стирать!!!

/* ANSI !!! */
void ByteToBin(unsigned char Value, char *Result)
{
 unsigned char I, One=0x80;
 for(I = 0, *Result = 0; I < 8; I++, One >>= 1)
   strcat(Result, ((Value & One) ? "1" : "0"));
}

:))))


 
WebErr ©   (2004-04-15 16:15) [27]

Объявляю конкурс на самый короткий код на паскале этой функции! :))))
Приз поллитра от создателей сайта (не скажу какого)!!! :))))


 
MBo ©   (2004-04-15 16:26) [28]

;)
function ToBinStr(b:byte):string;
var bb:Byte;
begin
Result:="        ";
for bb:=7 downto 0 do Result[8-bb]:=Chr(48+(b shr bb) and 1);
end;


 
Sam Stone ©   (2004-04-15 16:29) [29]

Пжалста ;))
uses idGlobal;
function IntToBin(Value: cardinal): string;
Returns a binary string representation for an Integer value.


 
WebErr ©   (2004-04-15 16:30) [30]


> MBo ©   (15.04.04 16:26) [28]

Пока ты - лидер!
Но для лучшей читаемости

Result:="12345678";


 
Игорь Шевченко ©   (2004-04-15 16:33) [31]

function IntToBin(Value: Longint; Digits, Spaces: Integer): string;
begin
 Result := "";
 if Digits > 32 then Digits := 32;
 while Digits > 0 do begin
   if (Digits mod Spaces) = 0 then Result := Result + " ";
   Dec(Digits);
   Result := Result + IntToStr((Value shr Digits) and 1);
 end;
end;


RxLib


 
Alx2 ©   (2004-04-15 16:47) [32]

Сократил код  у Бориса (MBo) :)))

 Function ToBinStr(b: byte): ShortString;
 Var
   bb: Byte;
 Begin
   For bb := 7 Downto 0 Do
     Result[8 - bb] := Chr(48 + (b Shr bb) And 1);
   Result[0]:=#8;
 End;


 
WebErr ©   (2004-04-15 16:50) [33]


> Alx2 ©   (15.04.04 16:47) [32]

Сократил на 6 символов (видимых и не пробелов) вот и получай пока лидерство (а не поллитра - пока) и проблемы с авторскими правами и зубами!!! :))))


 
Fay ©   (2004-04-15 17:10) [34]

Я не силён в ShortString-ах, скажите - длину задавать не надо?
Result[8 - bb] от Alx2 ©   (15.04.04 16:47) [32] не смущает?
8)


 
WebErr ©   (2004-04-15 17:15) [35]


> Fay ©   (15.04.04 17:10) [34]

Всё дело в строчке

Result[0]:=#8;

В String (коротких!) первый байт с индексом ноль (!) - это длина строки.
Т.е.
S := "123";
S[0] = #3
S[1] = "1"
S[2] = "2"
S[3] = "3"


 
Fay ©   (2004-04-15 17:20) [36]

А ей (это строчке) не лучше бы находиться перед Result[8 - bb] ?


 
WebErr ©   (2004-04-15 17:25) [37]

Без разницы - всё равно, пока не начнём юзать данный стринг, главное, чтобы за 255 индекс не перевалил! :)))) 8 < 255



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

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.026 c
3-1081178285
olhovik
2004-04-05 19:18
2004.05.02
Добавление записи в файл


3-1081346919
Koba
2004-04-07 18:08
2004.05.02
Базы данных


4-1078338089
deema
2004-03-03 21:21
2004.05.02
Как отменить прорисовку child windows-ов?


1-1081795854
Роман К
2004-04-12 22:50
2004.05.02
Как изменить имя файла при изменении типа файла в TSaveDialog


1-1082031629
P0tia
2004-04-15 16:20
2004.05.02
Нажатие клавишь