Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

Преобразование 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.12 c
11-1066937743
puky
2003-10-23 23:35
2004.05.02
Конвертирование компонентов


1-1081929826
SergP
2004-04-14 12:03
2004.05.02
ZLib. Как распаковать строку?


3-1081343562
wild_arg
2004-04-07 17:12
2004.05.02
Удаление записей из dbf


6-1078992878
knack
2004-03-11 11:14
2004.05.02
Установка и изменение настроек протокола TCP/IP.


11-1065608167
Stargazer
2003-10-08 14:16
2004.05.02
JpegObj &amp; FPC





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский