Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2009, 03:10   #1
Karp_13
Всё знать хотяка!
Пользователь
 
Аватар для Karp_13
 
Регистрация: 21.04.2009
Сообщений: 67
Вопрос Байты и биты

Щас пока копаюсь в интернете, пытаюсь найти ответ на свой вопрос, но пока решил пробегом запостить его и здесь.))) Если найду удовлетворяющий меня ответ до того, как ответят здесь - удалю темку.)))
И так, к делу:

Байт в "идеале" это 00000000 вот такой вот набор ноликов и единичек. Отсчёт идёт справа налево 0,1,2,3,4,5,6,7 .
Моя цель изменить(если был нолик - записать единичку, если едничка - записать нолик) i-ый бит... ну скажем, 3-ий бит.
У меня небольшая каша в голове насчёт программного представления этого типа данных. Чтобы разобраться, расширяю свою цель до следующего:
Считать откуда нибудь байт(например, читаем с порта LPT). Записать между делом его в edit1 в виде ноликов и единичек. Изменить в считанном байте значение 3-его бита. Записать новый байт между делом в edit2 в виде ноликов и единичек. Послать новый байт туда же, откуда мы его считали...
Варваским методом я проблему решил - получаю байт в десятичной системе исчисления. Процедура1 преобразует десятичное число в двоичную систему исчисления и выдаёт строку string1 ноликов и единичек. Процедура2 меняет по средствам простого условного оператора в строке string1 нужный символ на '0' или '1'. Процедура3 преобразует измененный string1 в число в десятичной системе исчисления и посылает туда же, откуда считали... Чёрт, но это слишком много действий, а у меня каждая миллисекунда на счету %(( ...

Знаю/слышал/ищу, что всё это можно проделать функцией в одну строку, с применением операторов смещения и сравнения... Ну вообщем, вот как то так... Думаю проблематика понятна)))) Прошу помощи)))
Я вредный и нервный, но бдобр.
Karp_13 вне форума Ответить с цитированием
Старый 07.11.2009, 03:15   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

учим логические операции(not и and) а также битовый сдвиг(shl)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.11.2009, 03:26   #3
Karp_13
Всё знать хотяка!
Пользователь
 
Аватар для Karp_13
 
Регистрация: 21.04.2009
Сообщений: 67
По умолчанию

Ыть, немного не успел))) Уже нашёл хороший мануал по этому делу)))
http://prg.vedenin.ru/4.php

Но всё равно терзает вопрос:
Можно ли считать байт x:byte ... применить к нему что-то типа inttostr ... и вывести в edit1 сразу строчку из ноликов и единичек...
Я вредный и нервный, но бдобр.
Karp_13 вне форума Ответить с цитированием
Старый 07.11.2009, 08:01   #4
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

Код:
function BuffToBin(var buff; BuffSize : Integer) : string;
type
  PByteArray = ^TByteArray;
  TByteArray = array [0..0] of byte;
var
  i, j, CharIndex, OutLength : Integer;
  pbuff : PByteArray;
begin
  OutLength := BuffSize shl 4;
  SetLength(result, OutLength);
  pbuff := @buff;
  CharIndex := 1;
  for i := 0 to BuffSize - 1 do
  begin
    for j := 0 to 7 do
    begin
      if (pbuff^[i] and (1 shl j)) = 0 then
        Result[CharIndex] := '0'
        else
        Result[CharIndex] := '1';
      Inc(CharIndex);
    end;
  end;
end;
var
Код:
var
  i : Integer;
begin
  i := 1234;
  Edit1.Text := BuffToBin( i, sizeof(i) );
end;
Сказал и загрустил от бесспорности своей правоты.

Последний раз редактировалось 0nni; 07.11.2009 в 08:13.
0nni вне форума Ответить с цитированием
Старый 07.11.2009, 08:06   #5
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Может и есть где-то в дебрях Делфи такая функция. Но действительно, запомнить их все задача не для слабаков. А я слабак! И потому обычно сам пишу подобные вещи.
Код:
function ByteToStr(n: byte): string;
var
  i: byte;
  b,d: byte;
begin
  for i := 0 to 7 do
  begin
    if i = 0 then d := 128
    else d := d shr 1;
    b := n and d;
    if b = 0 then Result := Result + '0'
    else Result := Result + '1';
  end;
end;

Последний раз редактировалось Баламут; 07.11.2009 в 08:20.
Баламут вне форума Ответить с цитированием
Старый 07.11.2009, 11:23   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а вот, до кучи, как эти процедурки реализованы в библиотечке TurboProfessional (Copyright (c) TurboPower Software 1987.)
Код:
const
  Digits: array[0..$F] of Char = '0123456789ABCDEF';

function BinaryB(B: Byte): string;
    {-Return binary string for byte}
var
  I, N: Word;
  S: ShortString;
begin
  N := 1;
  S[0] := #8;
  for I := 7 downto 0 do begin
    S[N] := Digits[Ord(B and (1 shl I) <> 0)]; {0 or 1}
    Inc(N);
  end;
  BinaryB := S;
end;

function BinaryL(L: LongInt): string;
    {-Return binary string for LongInt}
var
  I: LongInt;
  N: Byte;
  S: ShortString;
begin
  N := 1;
  S[0] := #32;
  for I := 31 downto 0 do begin
    S[N] := Digits[Ord(L and LongInt(1 shl I) <> 0)]; {0 or 1}
    Inc(N);
  end;
  BinaryL := S;
end;
под Дельфи сделал небольшие доработки (раньше, в TP, все строки были ShortString, а теперь потребовалось ввести дополнительную переменную...)
и ещё, массив Digits может быть сокращён до
Digits: array[0..1] of Char = '01';
просто в оригинальной библиотеке он ещё используется для преобразования в Hex, поэтому я его так и оставил...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.11.2009, 12:02   #7
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

А что мне остается ....
Мне остается дать ссылку на http://www.excode.ru/art5629p5.html
Здесь переводы из одной системы (2,8, 10, 16) в другую (аналогично) несколькими способами + универсальная функция перевода из любой в любую.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 10.11.2009, 00:09   #8
Karp_13
Всё знать хотяка!
Пользователь
 
Аватар для Karp_13
 
Регистрация: 21.04.2009
Сообщений: 67
По умолчанию

Всем громадное спасибо)) Просмотрел все предложенные варианты)))
В итоге всё таки решил остановится(я ленив))) на двух старых функциях(приведу их здесь... авось какому нибудь скитальцу по сети помогут)) (Спасибо громадное также DeKot'у, сэкономил мне немного времени)))):

Код:
function Dec_Bin(N_dec: integer): string; //десятичное число в двоичную строку
var i: byte;
    weight: byte;
    mas_bit: Array[0..7]of byte;
    s:string[8];
begin
  s:='';
  weight:= 128;
  for i:= 7 downto 0 do
  begin
    mas_bit[i]:= N_dec div weight;
    s:=s+floattostr(mas_bit[i]);
    if mas_bit[i] = 1 then N_dec:= N_dec - weight;
    weight:= weight div 2;
  end;
  Result:= s;
end;
//
function stepen(a:integer; b:integer):integer; //возведение в степень
var i:integer;
begin
result:=1;
for i:=1 to b do result:=result*a;
end;
//
function Bin_Dec(s: string): integer;   //двоичную строку в десятичное число
var i: integer;
begin
  result:=0;
  for i:=1 to 8 do result:=result+strtoint(s[i])*stepen(2,8-i);
end;
Ну и если ни у кого нет случайно предложений по их оптимизации, думаю тему можно закрывать)))
Я вредный и нервный, но бдобр.

Последний раз редактировалось Karp_13; 10.11.2009 в 00:17.
Karp_13 вне форума Ответить с цитированием
Старый 10.11.2009, 00:28   #9
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

IntToHex function
HexToBin function
С хэлпом никак? По аглицки "моя не понимай"?
mihali4 вне форума Ответить с цитированием
Старый 10.11.2009, 00:33   #10
Karp_13
Всё знать хотяка!
Пользователь
 
Аватар для Karp_13
 
Регистрация: 21.04.2009
Сообщений: 67
По умолчанию

Чъорт, спасиб)) Где ж ты раньше был)))
Хелпом пользоваться не интересно %(( Знаю, плохая привычка))))
Я вредный и нервный, но бдобр.
Karp_13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как перевести биты в мегабайты? Юзер7 Свободное общение 7 19.06.2009 17:27
Сбросить 3,5,7 биты veter_s_morya Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 20.05.2008 09:43
Байты в стринги FaTaL Общие вопросы Delphi 9 18.04.2008 15:46
Помогите заменить байты в файле Dax Общие вопросы Delphi 3 21.06.2007 10:24