Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
iga7013
1 / 1 / 0
Регистрация: 02.06.2013
Сообщений: 38
#1

Битовые операции. Сдвиг вправо и взятие остатка от деления - C++

28.10.2013, 11:42. Просмотров 2746. Ответов 19
Метки нет (Все метки)

Есть задача: определить количество ноликов в веденном пользователем числе с помощью битовых операций.
Вот что у меня уже есть:


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
33
34
#include <conio.h>
#include <locale.h>
#include <iostream>
using namespace std;
 
 
int chislo(int);
void main()
{
    setlocale(0,"rus");
    int x;
    cout<<"Введите число:";
    cin>>x;
    int y=chislo(x);
    cout<<"В вашем числе - "<<y<<" ноликов";
    _getch();
}
 
 
int chislo(int x)
{
    int sum=0;
    while (x>0)
    {
        if ((x%2)==0)
        {
            sum++;
        }
        
            x=x>>1;
        
    }
    return sum;
}

И сама проблемка, строчку №25
if ((x%2)==0)
нужно заменить битовыми операциями.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2013, 11:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Битовые операции. Сдвиг вправо и взятие остатка от деления (C++):

Дано целое число (N>0), используя операции деление нацело и взятие остатка от деления, вывести все его цифры начиная с самой правой - C++
Задание звучит так: Дано целое число (N&gt;0), используя операции деление нацело и взятие остатка от деления, вывести все его цифры начиная с...

Где и когда уместно применять операции << (сдвиг влево) и >> (сдвиг вправо)? - C++
Кто может привести пример , когда нужно использовать операции: 1) &lt;&lt; сдвиг влево 2) &gt;&gt; сдвиг вправо

Используя операции деления нацело и взятия остатка от деления, определить, имеется ли в записи числа цифра k - C++
Полное условие: Дано натуральное число n. Используя операции деления нацело и взятия остатка от деления, определить, имеется ли в записи...

Дано целое число N(>0).используя операции деления нацело и взятия остатка от деления, найти количество и сумму его цифр - C++
Дано целое число N(&gt;0).используя операции деления нацело и взятия остатка от деления, найти количество и сумму его цифр. :wall::(

Определить результат целочисленного деления a на b, не используя стандартные операции вычисления остатка - C++
Не совсем понимаю условие. Как решить? Даны целые числа a,b(a&gt;b). Определить результат целочисленного деления a на b, не используя...

Побитовые операции: как работает этот сдвиг вправо и логическое "И"(&) ? - C++
в этой функции перевожу в двоичную с/с но не могу понять как работает этот сдвиг вправо и логическое &quot;И&quot;(&amp;) в 5 строчке опишите по...

19
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.10.2013, 11:49 #2
C++
if((x >> 1) & 0)
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
28.10.2013, 11:53 #3
C++
1
2
3
4
5
6
7
for (int i = 0; i < sizeof(int) * CHAR_BIT; ++i)
{
    if (!((x >> i) & 1))
    {
        ++sum;
    }
}
0
castaway
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
28.10.2013, 11:53 #4
C++
1
if ( (x & 1) == 0 )
1
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
28.10.2013, 11:55 #5
Не проверял, но должно работать:
C++
1
2
3
4
5
6
int sun = 0;
do
{
    number = number >> 1;
    sum += (~number) & 1;
}while(number > 0);
ForEveR, а если старшие биты нули?
0
XRuZzz
Антикодер
687 / 593 / 29
Регистрация: 15.09.2012
Сообщений: 2,541
28.10.2013, 12:01 #6
Цитата Сообщение от iga7013 Посмотреть сообщение
Есть задача: определить количество ноликов в веденном пользователем числе с помощью битовых операций.
количество ноликов нужно определять в двоичном числе или десятичном?

Цитата Сообщение от programina Посмотреть сообщение
if((x >> 1) & 0)
всегда false
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
28.10.2013, 12:05 #7
Поправлюсь:
C++
1
2
3
4
5
6
int sun = 0;
do
{
    sum += (~number) & 1;
    number = number >> 1;
}while(number > 1);
ну или типа того...
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
28.10.2013, 12:06 #8
Цитата Сообщение от Ilot Посмотреть сообщение
ForEveR, а если старшие биты нули?
Не понятен вопрос. И что далее? Мы бежим по всем битам числа.
0
iga7013
1 / 1 / 0
Регистрация: 02.06.2013
Сообщений: 38
28.10.2013, 12:09  [ТС] #9
Цитата Сообщение от XRuZzz Посмотреть сообщение
количество ноликов нужно определять в двоичном числе или десятичном?
Количество ноликов нужно определять в двоичном числе.

Добавлено через 1 минуту
Цитата Сообщение от castaway Посмотреть сообщение
C++
1
if ( (x & 1) == 0 )
Спасибо
Все работает!
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
28.10.2013, 12:10 #10
Цитата Сообщение от ForEveR Посмотреть сообщение
Не понятен вопрос. И что далее? Мы бежим по всем битам числа.
Смотрим:
00010011
Допустим смещаемся на 5 бит тогда выражение:
!((00010011 >> 5) & 1) == true
Или может я очередной раз ошибаюсь?
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.10.2013, 12:17 #11
проверила на ideone

C++
#include <iostream>
using namespace std;
 
int x = 1903107;
int sum = 0;
 
int main() {
    for(int i=0; i<5; i++) {
    if(((x >> i) & 1) == 1)
      sum ++;
    }
     
    cout << sum << endl;
    return 0;
}
0
castaway
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
28.10.2013, 12:20 #12
Цитата Сообщение от programina Посмотреть сообщение
проверила на ideone
Разве она не единицы считает?
0
iga7013
1 / 1 / 0
Регистрация: 02.06.2013
Сообщений: 38
28.10.2013, 12:20  [ТС] #13
Цитата Сообщение от Ilot Посмотреть сообщение
Смотрим:
00010011
Допустим смещаемся на 5 бит тогда выражение:
!((00010011 >> 5) & 1) == true
Или может я очередной раз ошибаюсь?
Двоичное число не может начинаться с нулей, на сколько я знаю...
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.10.2013, 12:22 #14
Цитата Сообщение от castaway Посмотреть сообщение
Разве она не единицы считает?
возвращает единицу если цифра равна нулю.
0
castaway
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
28.10.2013, 12:25 #15
Цитата Сообщение от programina Посмотреть сообщение
возвращает единицу если цифра равна нулю.
С какой такой стати то?
C++
1
2
3
    if(((x >> i) & 1) == 1)
      sum ++;
    }
((11111111 >> i) & 1) == 1
В этом примере sum будет равно 8. (разумеется 11111111 - я записал в двоичном виде)
1
28.10.2013, 12:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2013, 12:25
Привет! Вот еще темы с ответами:

Битовые операции, битовые поля. - C++
Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций. Записать в unsigned int. Использовать...

С помощью операций деления нацело и взятия остатка от деления определить, имеется ли в записи числа N цифра 2 - C++
//Дано целое число N(&gt; 0).С помощью операций деления нацело и взятия остатка от деления определить, имеется //ли в записи числа N цифра...

Битовые операции и операции смещения языка С - C++
Доброго времени суток господа,помогите пожалуйста.Есть 2 кода к задаче,первый работает верно(переводит обычные числа в 16-ти ричные),а...

Используя одну операцию деления нацело и одну операция взятия остатка от деления найти цифру. соответствующую разряду ты - C++
Дано целое число, большое 999. Используя одну операцию деления нацело и одну операция взятия остатка от деления найти цифру....


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru