Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 062

/ вопрос решён /

Здравствуйте, уважаемые эксперты!
Очень нужна ваша помощь.
Объясните как работает условие

if (Value and (1 shl i)) > 0
в следующем коде:

function IntToBin(Value: integer; Digits: integer): string;
var
  i: integer;
begin
  result := '';
  for i := 0 to Digits - 1 do
    if (Value and (1 shl i)) > 0 then
      result := '1' + result
    else
      result := '0' + result;
end;

Проблема в том, что мне нужно как-то исправить этот код, чтобы он при
IntToBin(72, 64);
выводил
0000000000000000000000000000000000000000000000000000000001001000
а не так как он сейчас работает и выводит
0000000000000000000000000100100000000000000000000000000001001000

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

код взят отсюда: http://www.delphisources.ru/pages/faq/base/number_to_binary.html

Приложение:
  1. function IntToBin(Value: integer; Digits: integer): string;
  2. var
  3. i: integer;
  4. begin
  5. result := '';
  6. for i := 0 to Digits - 1 do
  7. if (Value and (1 shl i)) > 0 then
  8. result := '1' + result
  9. else
  10. result := '0' + result;
  11. end;


disillusion Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: disillusion (статус: Посетитель)
Вопрос отправлен: 9 апреля 2012, 16:53
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Ахтунг! Писал на коленке, не отлаживал (нет времени, рабочий день кончается).

function IntToBin(Value: Int64; Digits: Integer): string;
var
  Index: Integer;
begin
  SetLength(Result, Digits);
  FillChar(Result[1], Digits, '0');
  Index:= Digits;
 
  while (Value <> 0) and (Index > 0) do
    begin
      Result[Index]:= Char($30 + (Value and 1));
      Dec(Index);
      Value:= Value shr 1;
    end;
end;

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 9 апреля 2012, 17:09
Оценка за ответ: 5

Комментарий к оценке: Спасибо за шедевр!
Во всем разобрался.
То что нужно!

Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 9 апреля 2012, 20:42; участников в обсуждении: 2.
disillusion

disillusion (статус: Посетитель), 9 апреля 2012, 17:18 [#1]:

что значит
(Value and 1)
в строке
Result[Index]:= Char($30 + (Value and 1));
?
disillusion

disillusion (статус: Посетитель), 9 апреля 2012, 18:17 [#2]:

все. со всем разобрался.
спасибо за помощь!

9 апреля 2012, 18:20: Статус вопроса изменён на решённый (изменил автор вопроса — disillusion)

min@y™

min@y™ (статус: Доктор наук), 9 апреля 2012, 20:09 [#3]:

Цитата (disillusion):

что значит (Value and 1)

Гашение всех остальных разрядов, кроме нулевого. Для того, чтобы узнать, чему равен очередной разряд (0 или 1) после сдвига вправо.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
disillusion

disillusion (статус: Посетитель), 9 апреля 2012, 20:16 [#4]:

Ага. Я уже сам с этим разобрался.
Мне очень понравился ваш код.
Поучительно для меня.
Спасибо =)
min@y™

min@y™ (статус: Доктор наук), 9 апреля 2012, 20:42 [#5]:

Цитата (disillusion):

Мне очень понравился ваш код.

Это почему?
Думаю, что можно этот код даже оптимизировать. Просто у меня было 5 минут всего, чтобы что-то написать. Ровно в 17:15 отрубают питание (220В), пора было вырубать комп. Что пришло на мозг, то и набросал.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:26
Выполнено за 0.03 сек.