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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2014, 20:42   #1
NoviceYola
Пользователь
 
Регистрация: 09.11.2013
Сообщений: 19
Вопрос Побитовые операции (PascalABC)

Вставить 0 в двоичное представление числа после третьей 1, считая с конца.

or

Вставить в двоичное представление длинного целого числа группу из двух единиц, начиная с позиции, номер которой вводится с клавиатуры. В программе реализовать 2 ограничения: номер позиции для вставки не должен выходить за пределы длины двоичного представления, новое число не должно выходить за пределы длинного целого.

p.s. Нельзя использовать массивы для хранения цифр двоичного представления вводимых или выводимых чисел. Все преобразования необходимо выполнить, используя либо арифметические операции “+” или “-“ либо побитовые операции “shl”, “shr”, “and”, “or” или “xor”.
NoviceYola вне форума Ответить с цитированием
Старый 17.06.2014, 20:56   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вставить 0 в двоичное представление числа после третьей 1, считая с конца.
Допустим число - байт
Код:
Число:=(16 or Число) and 15;
Если не ошибаюсь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.06.2014, 21:48   #3
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

ТС пояснил, что ему нужно так:
Было
101101111
Стало
101100111

По первой задаче:
Код:
{Вставить 0 в двоичное представление числа после третьей 1, считая с конца.}
var
  q,n,i,x:integer;
  isThirdBitEqual1:boolean;

function FromDec(n, radix:longint):string;
var
  s: String;
const
  digit: string[16]='0123456789ABCDEF';
begin
  s:='';
  repeat
    s:=digit[(n mod radix)+1]+s;
    n:=n div radix;
  until n=0;
  FromDec:=s;
end;

begin
  isThirdBitEqual1:=false;
  write('Введите число:'); readln(x);
  writeln('Его двоичное представление: ',FromDec(x,2));
  q:=0;
  for i:=0 to SizeOf(integer)*8 - 1 do
    begin
      if (x and (1 shl i)) <> 0 then
      begin
        inc(q);
        writeln(i,'-й бит установлен в единицу.');
        if q=3 then
          begin
            isThirdBitEqual1:=true;
            n:=i;
          end;
      end;
    end;
  if isThirdBitEqual1 then
    begin
      writeln('Число единиц равно: ',q,'. Позиция третьей 1 = ',n);
      x := x and not (1 shl (N+1)); {или (n-1), если в обратную сторону}
      writeln('Двоичное представление после обработки: ',FromDec(x,2));
    end
  else
    writeln('Число единиц меньше 3.');
  readln;
end.
Изображения
Тип файла: jpg 2014-06-17 21-59-08 Free Pascal IDE.jpg (45.5 Кб, 120 просмотров)

Последний раз редактировалось Stilet; 17.06.2014 в 22:32.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 17.06.2014, 22:04   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

1
Код:
i:=((i shr 4) shl 4) or (i and 7);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.06.2014, 22:04   #5
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Кстати, правильно ли я понял задачу?
Имеем
101111
Получаем
100111
Или нужно сдвинуть влево на n позиций, начиная с позиции третьей 1? И установкой в ноль позиции после?
010111
?
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 17.06.2014, 22:05   #6
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Перестала нажиматься кнопка "Правка"
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 17.06.2014, 22:20   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Все запутались..
ИМХО : 101111 -> 1010111
Poma][a вне форума Ответить с цитированием
Старый 17.06.2014, 22:28   #8
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Да, именно так. У меня не верно.
Тогда вопрос: как сдвинуть цепочку из n битов влево, начиная c k-той позиции?
Точнее, как ее раздвинуть?

Сдвинуть, раздвинуть камасутра какая-то, а не программирование

Последний раз редактировалось ZX Spectrum-128; 17.06.2014 в 22:33.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 17.06.2014, 22:29   #9
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Код:
var
	n, i, j, m : Integer;

begin
	ReadLn(n);
	i := 0; j := 0; m := 0;

	while i <> 3 do begin
		m := n mod 2 shl j + m;
		Inc(i, n mod 2);
		Inc(j);
		n := n div 2
	end;
	
	WriteLn(n shl (j+1) + m)
end.
Poma][a вне форума Ответить с цитированием
Старый 17.06.2014, 22:56   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Все запутались..
ИМХО : 101111 -> 1010111
1. Тоды так
Код:
i:=((i shr 3) shl 4) or (i and 7);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Побитовые операции V_I_P Общие вопросы C/C++ 5 15.10.2013 22:07
С/С++, ПОБИТОВЫЕ ОПЕРАЦИИ. gopnikdj Помощь студентам 5 25.12.2012 18:29
побитовые операции serega28 Паскаль, Turbo Pascal, PascalABC.NET 11 25.01.2011 14:02
Побитовые операции С++ Defa4ka Помощь студентам 4 22.06.2010 14:55
побитовые операции Александе еть я Общие вопросы C/C++ 2 18.04.2010 13:31