|
Вопрос # 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
Приложение: Переключить в обычный режим- 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;
 |
Вопрос задал: 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 (статус: Посетитель), 9 апреля 2012, 17:18 [#1]:
что значит
(Value and 1)
в строке
Result[Index]:= Char($30 + (Value and 1));
?
|
|
disillusion (статус: Посетитель), 9 апреля 2012, 18:17 [#2]:
все. со всем разобрался.
спасибо за помощь!
|
9 апреля 2012, 18:20: Статус вопроса изменён на решённый (изменил автор вопроса — disillusion)
|
min@y™ (статус: Доктор наук), 9 апреля 2012, 20:09 [#3]:
Цитата (disillusion):
что значит (Value and 1)
Гашение всех остальных разрядов, кроме нулевого. Для того, чтобы узнать, чему равен очередной разряд (0 или 1) после сдвига вправо.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
disillusion (статус: Посетитель), 9 апреля 2012, 20:16 [#4]:
Ага. Я уже сам с этим разобрался.
Мне очень понравился ваш код.
Поучительно для меня.
Спасибо =)
|
|
min@y™ (статус: Доктор наук), 9 апреля 2012, 20:42 [#5]:
Цитата (disillusion):
Мне очень понравился ваш код.
Это почему?
Думаю, что можно этот код даже оптимизировать. Просто у меня было 5 минут всего, чтобы что-то написать. Ровно в 17:15 отрубают питание (220В), пора было вырубать комп. Что пришло на мозг, то и набросал.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|