Другие языки программирования и технологии

Пожалуйста! Помогите с Паскалем! Обещаю 10 баллов!

Задача: Дан целочисленный массив {xi}, i = 1, 2, ..n. Напечатать те положительные элементы массива, которые являются степенями двойки (1, 2, 4, 8, ..). Вопрос: С вводом массива все ясно. Какой механизм должен проверять степени двойки? Напишите пожалуйста код этого механизма!
Доброго времени суток.

Механизм простой. Число, являющееся степенью двойки имеет в своей двоичной записи только одну единицу. Надеюсь, объяснять не надо, почему? Отсюда и функция проверки некоторого целого числа

function IsPower2(n: Integer): Boolean;
var C : Integer;
begin
C := 0; {счетчик единиц}
while n > 0 do begin
C := C + (n and 1); {проверяем младший разряд на единицу и суммируем единицы}
n := n shr 1; {сдвигаем число на разряд вправо}
end;
IsPower2 := C = 1; {если единица одна, вернем истину}
end;

Ну а дальше труда представить не должно

if (x[ i ] > 0) and IsPower2(x[ i ]) then печатем

и все это в цикле.

Удачи!
АТ
Алексей Топор
59 613
Лучший ответ
Александр Филько Через функции нельзя писать (препод не разрешает), надо бы через вложенные циклы
Андрей Давыдов идея красивая))) действительно, так проще)))
Это элементарно
В цикле
if (mass = 2^i) then write(' ', mass);

Пусть надо вычислить X со степенью n.

Function pow(x, n: real) : real;
Begin
pow := exp(n*ln(x));
End;

в программе будет :
if (mass = pow(2, i)) then write(' ', mass);

Надеюсь функции знаешь что такое...
Александр Филько В Паскале символом ^ степень не ставится!
var
k,o, z:integer;
begin
cls;
write(' введите число '); readln(k);
repeat
o:=k mod 2;
z:= k div 2;
k:= z;
until k<2;
if o=0 then writeln (' stepen') else writeln (' net stepen') ;

end.

у меня все считает.

осталось только запаковать в массив)))
N.u.r.l.a.n -=[A*n*s]= а оно и не считает все числа(((