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

Цикл для проверки битов числа

18.10.2015, 12:26. Показов 7697. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется задача: "Определить, насколько в числе А больше значащих битов, равных единице, чем битов, равных ну-лю".
Собственно, я представляю решение этой задачи так, сравниваем каждый бит числа А с 0 с помощью операции XOR, если биты отличны, значит этот бит 1, прибавляем переменной z++, в противном случае переменной o++. И так все биты числа А. После мы просто выведем o/z, если 1 больше, z/o, если 0 и просто ответ, что их количество одинаково, если их количество одинаково. Вопрос, как организовать цикл проверки всех битов в А?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.10.2015, 12:26
Ответы с готовыми решениями:

Цикл для проверки выражения
Пожалуйста, помогите с циклом. Необходимо организовать ввод массива с клавиатуры (уже готово), и если первый элемент меньше второго,...

Создать цикл для проверки
Помогите сделать проверку в таком коде ,нужно чтобы программа выводила максимальное и минимальное значение средней оценки(avg) ...

Как сформулировать цикл для проверки и поздравления с Днем рождения?
Доброго времени суток! Необходимо считывать дату рождения из БД, сравнивать с текущей и если у этого человека ДР в ближайшие 2 дня -...

17
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
18.10.2015, 12:30
Нужно вывести "на сколько 1 больше 0".
Т.е.:
00001111 => 4 - 4 = 0
00011111 => 5 - 3 = 2
00000111 => 3 - 5 = -2
Я так себе представляю.
0
653 / 161 / 64
Регистрация: 08.04.2015
Сообщений: 410
18.10.2015, 12:32
Как-то так:
C++
1
2
3
4
5
6
int A=1234567890;
int Zeros=0, Ones=0;
for (int n=0; n<sizeof(int)*8; n++)  {
  if ((A>>n)&0x01)  Ones++;
  else  Zeros++;
  }
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
18.10.2015, 12:39
UnknownSoldier, у Вас проход идет не по значащим, а по всем битам числа.
0
653 / 161 / 64
Регистрация: 08.04.2015
Сообщений: 410
18.10.2015, 12:49
Kerry_Jr, согласен, упустил в условии этот момент. Тогда так:
C++
1
2
3
4
5
6
7
8
int A=1234567890;
int Zeros=0, Ones=0;
for (int n=sizeof(int)*8; n; n--)  {
  if ((A>>(n-1))&0x01)  Ones++;
  else  {
    if (Ones)  Zeros++;
  }
if (Zeros==0 && Ones==0)  Zeros++;
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
18.10.2015, 12:53
Лучший ответ Сообщение было отмечено want_my_dream как решение

Решение

Цитата Сообщение от Kerry_Jr Посмотреть сообщение
у Вас проход идет не по значащим, а по всем битам числа.
так в том то и дело что из условия не понятно все считать или начать со старшей 1
а если будет число 0?
на можно примерно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func( unsigned int n)
{
int one=0;
int zero=0;
int i=sizeof(unsigned int);
while(!(n&0x80000000))
{
n<<=1;
i--;
}
for(;i!=0;i--,n<<=1)
{
if(n&0x80000000)
 one++;
else
 zero++;
 
}
 
 
}
а для всех разрядов я бы сделал так
C++
1
2
3
4
5
6
7
8
while(n)
{
 if(n&0x80000000)
  one++;  
n<<=1;
 
}
zero=sizeof(int)-one;
или так
C++
1
2
3
4
5
6
7
8
while(n)
{
 if(n&1)
  one++;  
n>>=1;
 
}
zero=sizeof(int)-one;
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
18.10.2015, 12:57
want_my_dream, чё молчишь? Скажи хоть слово. Тебе люди тут помочь пытаются.
0
0 / 0 / 1
Регистрация: 11.04.2015
Сообщений: 31
18.10.2015, 13:11  [ТС]
Я тут думал просто, и следуя из того, что посоветовал ValeryS, код работает, ну, вроде работает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
using namespace std;
 
int main() {
    setlocale(LC_ALL, "RUS");
 
    int A, o = 0, z = 0;
 
    cout << "Введите число: ";
    cin >> A;
 
    while(A) {
        if (A & 1)
            o++;
        else
            z++;
        A >>= 1;
    }
 
    if (z > o) {
        cout << "В числе А битов равных нулю больше, чем равных единице на " << (z - o) << endl;
    }
    else {
        if (z < o)
            cout << "В числе А битов равных единице больше, чем равных нулю на " << (o - z) << endl;
        else
            cout << "В числе А битов равных единице равно числу битов равных нулю." << endl;
    }
 
    system("pause");
    return 0;
}
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
18.10.2015, 13:19
want_my_dream, введите отрицательное число.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
18.10.2015, 13:25
Цитата Сообщение от want_my_dream Посмотреть сообщение
int A
вот это
Цитата Сообщение от want_my_dream Посмотреть сообщение
A >>= 1;
для знаковых работает иначе чем для беззнаковых про что и сказал Kerry_Jr,
и при отрицательном числе будет бесконечный цикл
или делай A unsigned или сдвигай в другую сторону и проверяй старший бит
C++
1
2
3
4
5
6
7
    while(A) {
        if (A &0x80000000 )
            o++;
        else
            z++;
        A <<= 1;
    }
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
18.10.2015, 13:27
ValeryS, можно просто написать A = abs(A); перед циклом.
0
0 / 0 / 1
Регистрация: 11.04.2015
Сообщений: 31
18.10.2015, 13:31  [ТС]
Этого достаточно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
unsigned int A;
 
    cout << "Введите число: ";
    cin >> A;
 
    while(A) {
        if (A & 1)
            o++;
        else
            z++;
        A >>= 1;
    }
Кстати, еще один вопрос, мы будем сдвигать число А вправо до тех пор, пока все биты не станут равными нулю, это так можно описать эту строчку - while(A)?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
18.10.2015, 14:23
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
ValeryS, можно просто написать A = abs(A); перед циклом.
и что мы получим?
-1 32 единицы
abs(-1)=1 одна единица

Добавлено через 22 секунды
Цитата Сообщение от want_my_dream Посмотреть сообщение
это так можно описать эту строчку - while(A)?
не понял вопроса
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
18.10.2015, 15:13
Цитата Сообщение от ValeryS Посмотреть сообщение
-1 32 единицы
это лишь представление отрицательного числа в памяти компьютера. Но в реальной двоичной системе так же есть знак и само число. Поэтому возникает еще один вопрос: должен ли знак влиять на результат?

Добавлено через 46 секунд
Цитата Сообщение от want_my_dream Посмотреть сообщение
мы будем сдвигать число А вправо до тех пор, пока все биты не станут равными нулю, это так можно описать эту строчку - while(A)?
почти, эту строчку можно описать так: пока А не равно 0.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
18.10.2015, 16:46
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Но в реальной двоичной системе так же есть знак и само число.
нет такой реальной двоичной системы
есть прямой код, обратный код,дополнительный код
так уж случилось что мы работаем, с дополнительным кодом
0
0 / 0 / 1
Регистрация: 11.04.2015
Сообщений: 31
18.10.2015, 17:01  [ТС]
Благодарю всех за помощь
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
18.10.2015, 17:11
ValeryS, ну вот, опять. Я же говорю не про код, а с математической точки зрения.
0
18.10.2015, 18:17

Не по теме:

Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Я же говорю не про код, а с математической точки зрения.
но находимся мы в ветке С++ для начинающих:)
что априори подразумевает код
а с математической точки зрения, знак не кодируется

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2015, 18:17
Помогаю со студенческими работами здесь

Цикл проверки условия для всех значений переменной в заданном интервале
какой цикл в С++ будет проверять условие abs((u-u1)/u1)&lt;E для всех(!) 0&lt;i&lt;N?

Цикл для проверки подходящего ключа и вывода всех возможных вариантов
привет всем...кто может помочь, задание такое...caesar cipher (метод шифрования текста)...есть зашифрованный текст, нужно вывести все...

Цикл: Используя цикл while, выведите на экран для числа 2 его степени от 0 до 20
Используя цикл while, выведите на экран для числа 2 его степени от 0 до 20. Возведение в степень в Python обозначается как **. Фрагмент...

Написать функцию, которая для заданного числа Х вычисляет количество единичных битов в этом числе
Написать функцию, которая для заданного числа Х вычисляет количество единичных битов в этом числе, используя побитовые операции и функции...

Циклический побитовый сдвиг числа вправо на указанное количество бит, но только для нечетных битов
Реализовать циклический побитный сдвиг числа вправо на указанное число(n), но только для нечетных битов Условия: Реализация задания в...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru