Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/34: Рейтинг темы: голосов - 34, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 07.03.2019
Сообщений: 16
1

Определить является ли число степенью двойки

29.01.2020, 08:05. Показов 6956. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Стоит задача
Ввести число. Определить является ли оно степенью 2 (число 16 является, а 22 нет)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.01.2020, 08:05
Ответы с готовыми решениями:

Определить, является ли число степенью двойки
По заданному положительному числу n < 2^64 определить, является ли оно степенью двойки. Решение...

Определить, является ли число степенью двойки
Такая проблема: в проге мне нужно задать количество чисел которые я введу (т.е создать массив под...

Определить, является ли число точной степенью двойки
Задание: Выведите слово "YES", если число N является точной степенью двойки, или слово "NO" в...

Определить, является ли данное число степенью двойки
Является ли данное число степенью двойки? Формат входных данных Вводится число. Формат выходных...

10
Заблокирован
29.01.2020, 08:26 2
Цитата Сообщение от etiy25 Посмотреть сообщение
Определить является ли оно степенью 2
C++
1
#define ispow2(x) !((x) & ((x) - 1))
1
0 / 0 / 0
Регистрация: 07.03.2019
Сообщений: 16
29.01.2020, 08:53  [ТС] 3
Все куда проще, спасибо гениальному _stanislav
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
using namespace std;
 
int main()
{
    int x;
    while(x >= 0)
    {
        cout << "Vvedite chislo: ";
        cin >> x;
 
        if (x && !(x & (x - 1) ) )
            cout << "Da";
        else
            cout << "Net";
 
        cout <<endl;
    }
 
    return 0;
}
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
29.01.2020, 09:03 4
Цитата Сообщение от etiy25 Посмотреть сообщение
Все куда проще, спасибо гениальному _stanislav
да ладно, я с СО скатал x && !(x & (x - 1) ), говорят этот трюк популярный.

Добавлено через 2 минуты
etiy25, в программировании как в жизни (хотя программирование есть часть жизни), если что то делаешь то, с вероятностью 99.9%, это уже кто то сделал до тебя.
0
случайный прохожий
2935 / 1952 / 606
Регистрация: 20.07.2013
Сообщений: 5,160
29.01.2020, 10:13 5
Все выглядит логичным (только догадаться самому до такой реализации не просто).
Число x является степенью двойки, если оно в двоичном виде в старшем разряде (бите) содержит 1, а остальные биты - 0. Количество бит = n.
Тогда (x - 1) содержит (n - 1) бит и все они равны 1.
Применяя побитовое "И" (&) для x и (x - 1) получаем 0. Тогда "инверсия" 0 (!0) дает 1.
А конструкция x && ... позволяет отсечь из результатов 0 (число).
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
29.01.2020, 11:13 6
Да, только это доказательство достаточности условия, но не необходимости.

ЗЫ этот трюк в числе других описан в книжке Уоррена.
0
gunslinger
29.01.2020, 12:10
  #7

Не по теме:

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

0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
29.01.2020, 13:52 8
Цитата Сообщение от _Ivana Посмотреть сообщение
ЗЫ этот трюк в числе других описан в книжке Уоррена.
Да эта инфа везде лежит. Например: http://graphics.stanford.edu/~... IfPowerOf2
Только почему-то все забывают, что тип должен быть беззнаковым.
Для примера:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <climits>
 
int main()
{
    for(int x = INT_MIN; x < INT_MIN + 3; ++x) {
        if (x && !(x & (x - 1))) {//1u избавит от UB (наверное :D), но всё равно не защитит от выдачи -2147483648
            std::cout << x << std::endl;
        }
    }
}
Warning(s):
source_file.cpp: In function ‘int main()’:
source_file.cpp:8:27: warning: iteration 1u invokes undefined behavior [-Waggressive-loop-optimizations]
if (x && !(x & (x - 1))) {
^
source_file.cpp:7:28: note: containing loop
for(int x = INT_MIN; x < INT_MIN + 3; ++x) {
^
-2147483648
https://rextester.com/TIXZV50059
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,886
30.01.2020, 09:30 9
Цитата Сообщение от Croessmah Посмотреть сообщение
Только почему-то все забывают, что тип должен быть беззнаковым.
А разве отрицательное число может быть степенью двойки?
0
Заблокирован
30.01.2020, 09:36 10
Да вы задолбали жевать эту тему, честное слово, ну скока можно?
C++
1
#define ispow2(x) ((x) > 0) && !((x) & ((x) - 1))
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
30.01.2020, 09:46 11
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А разве отрицательное число может быть степенью двойки?
Нет, поэтому использовать знаковое не имеет смысла.
Плюс, как было показано выше, подобная операция со знаковым может привести к UB.
Можно делать проверку, как Verevkin, но это как бы убивает саму идею.
0
30.01.2020, 09:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.01.2020, 09:46
Помогаю со студенческими работами здесь

Определить, является ли число степенью двойки (циклы)
Вводится число. Определить, является ли оно степенью двойки. ( с помощью цикла) Думала...

Определить, является ли число целой степенью двойки
Задано целое положительное число.Определить, является ли оно целой степенью двойки. Вход 1 16...

Определить, является ли заданное число точной степенью двойки
Дано натуральное число N. Вывести слово YES, если число N является точной степенью двойки, или...

Вводится число. Определить, является ли оно степенью двойки.
Вводится число. Определить, является ли оно степенью двойки. Необходимо использовать Операторы...

Является ли число степенью двойки
Дано натуральное число n. Определите, является ли оно степенью числа 2, и выведете слово YES если...

Является ли число степенью двойки
Условие: Входные данные Входной файл INPUT.TXT содержит единственное целое число N, не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru