Форум программистов, компьютерный форум CyberForum.ru

Найти степень двойки - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Составить функцию для разделения текста в С http://www.cyberforum.ru/cpp-beginners/thread184997.html
Составить функцию для разделения текста, заданного строкой литер, на отдельные слова и подсчета числа слов. Под словом понимается последовательность литер, отличных от пробела, ограниченная слева началом строки или пробелом и справа - пробелом, знаком препинания или концом строки. int kwords(char* ss, char * sm, int kmax); ss - исходная строка, sm - массив строк длиной до 30 литер каждая...
C++ Счетный цикл Здраствуйте! У меня вопрос по задаче "Написать программу, которая находит сумму косинусов всех чисел от 1 до введенного n." с использованием счетного цикла. Проблема в том, что ответ мне выводится совсем не тот, что нужен. Я думаю, что ошибка состоит в том, что я неправильно задаю косинус. Вот код: #include <iostream> #include <math.h> using namespace std; int main () { double i, n, p,... http://www.cyberforum.ru/cpp-beginners/thread184986.html
Циклический алгоритм (цикл с предусловием - while) C++
Здравствуйте!!! Помогите пожалуйста с задачей. TC++ Найти первый отрицательный член последовательности cos(ctg(n)) для n изменяющегося на следующим образом: n=1,2,3... . Заранее большое спасибо!
На С. Найти количество четных и большее из нечетных. C++
Даны целое число n, целые числа a1, a2, ..., an. Найти наибольшее из нечетных и количество четных чисел, входящих в последовательность a1, a2, ..., an+1. Программа должна содержать функцию, в main только вызов этой функции и ввод-вывод.
C++ Удалить из массива отрицательные элементы http://www.cyberforum.ru/cpp-beginners/thread184966.html
Подскажите пожалуйста!!! Задание: удалить из массива отрицательные элементы. Почему-то работает прога не полностью правильно . #include "stdio.h" void main ( )
C++ Каждую цифру целого числа х, поместить в отдельный элемент массива m Доброго вечера. Ув. форумчане помогите пожалуйста развязать маленькие задачки по программированию на С++, необходимо написать следующие программы: 1) каждую цифру целого числа х, поместить в отдельный элемент массива m. 2) четные переменные элементы m поместить в начало, а не четные в конец массива. 3) отсортировать одномерный массив m четырьмя способами.(какие вообще способы... подробнее

Показать сообщение отдельно
SemenovSA
37 / 3 / 0
Регистрация: 20.11.2015
Сообщений: 72
16.03.2016, 14:27
Попробую в силу своего разумения объяснить как это работает, надеюсь автор топика в противном случае меня поправит.
Первоначально определимся что мы должны найти, а должны мы найти двоичный логарифм числа, причем ответ должен быть целым.
Начнем с того простого факта, что в двоичном представлении любое целое число в степени имеет только одну битовую единицу.
Поясняю на примере
http://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
$2^1=2=b10, 2^2=4=b100, 2^3=8=b1000, и т.д.$<br />

2^1=2=b10, 2^2=4=b100, 2^3=8=b1000, и т.д.

Здесь ^ - означает возведение в степень
константа начинающая на b - двоичное представление числа

Интерес представляет 4 стока кода, а точнее
C
1
(x & (x-1))
& означает побитовое И. Напомню таблицу истинности для И

0&0=0
1&0=0
0&1=0
1&1=1

Как видно из таблицы TRUE мы получаем если совпадают 1-цы. Если мы отними 1 от b0010...0 то получим b0001...1, то есть единицы пресекается не будут и мы толучим FALSE. В противном случае получаем True и выводим сообщение о том что получить целый ответ не возможно. Пример
2^3=8 (нам нужно найти 3)

8=b1000
b1000-1=b0111
b1000&b0111=0

если например у нас число 9
9=b1001
b1001-1=b1000
b1001&b1000=b1000=true => ошибка, печатаем что число не подходит

Нам остается только определить номер разряда единицы

Дальше остальной алгоритм разберем, для кратности записи, в шенацатиричной системе. Напомню что для перевода из 0x в двоичную каждый разряд шеснацатиричной системы превращается в 4 разряда двоичной то есть 0x5=b0101 => 0x55=b0101 0101

Расмотрим что происходит с числом 128. (Как можно посчитать, его двоичный алгоритм равен 7)
на всякий случай
http://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
$128=b10000000=0x80$<br />

ответ для него 7 в двоичной = 111 или 0х07

и так первоначально х=0х80, в 8 строке убираем 1 получаем 0х7f или b0111 1111

разберем 9 строку
C
1
x = x - ((x >> 1) & 0x55555555);
x>>1 = 0x3f (смещение в право на 1 разряд)
0х3f&0x55...= 0x0055
x-0x0055=0x7f-0x0055=0x2A

х=0x2A

10 строка
C
1
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
(x & 0x33333333)= 0x22

((x >> 2) & 0x33333333)

(x >> 2)=0x2A>>2=0xA
((x >> 2) & 0x33333333)=0xA&0x3=0x2

(x & 0x33333333) + ((x >> 2) & 0x33333333) = 0x22+0x2=0x24

x=0x24

Цитата Сообщение от Kastaneda Посмотреть сообщение
x = (x + (x >> 4)) & 0x0F0F0F0F;
(x + (x >> 4))=0х26
(x + (x >> 4)) & 0x0F0F0F0F=0х26 & 0x0F=0х6

x=0x6

Цитата Сообщение от Kastaneda Посмотреть сообщение
x = x + (x >> 8); x = x + (x >> 16)
x=0x6+0=0x6

Цитата Сообщение от Kastaneda Посмотреть сообщение
x &= 0x0000003F;
x=x&0x3f=0x06&0x3f=0x6
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru