Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
iga7013
1 / 1 / 1
Регистрация: 02.06.2013
Сообщений: 38
#1

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

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

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


http://www.cyberforum.ru/cpp-beginners/thread811272.html
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++):

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

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

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

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

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

19
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.10.2013, 11:49 #2
C++
if((x >> 1) & 0)
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
28.10.2013, 11:53 #4
C++
1
if ( (x & 1) == 0 )
1
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 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
Антикодер
1367 / 643 / 36
Регистрация: 15.09.2012
Сообщений: 2,611
28.10.2013, 12:01 #6
Цитата Сообщение от iga7013 Посмотреть сообщение
Есть задача: определить количество ноликов в веденном пользователем числе с помощью битовых операций.
количество ноликов нужно определять в двоичном числе или десятичном?

Цитата Сообщение от programina Посмотреть сообщение
if((x >> 1) & 0)
всегда false
0
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 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
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
28.10.2013, 12:06 #8
Цитата Сообщение от Ilot Посмотреть сообщение
ForEveR, а если старшие биты нули?
Не понятен вопрос. И что далее? Мы бежим по всем битам числа.
0
iga7013
1 / 1 / 1
Регистрация: 02.06.2013
Сообщений: 38
28.10.2013, 12:09  [ТС] #9
Цитата Сообщение от XRuZzz Посмотреть сообщение
количество ноликов нужно определять в двоичном числе или десятичном?
Количество ноликов нужно определять в двоичном числе.

Добавлено через 1 минуту
Цитата Сообщение от castaway Посмотреть сообщение
C++
1
if ( (x & 1) == 0 )
Спасибо
Все работает!
0
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
28.10.2013, 12:10 #10
Цитата Сообщение от ForEveR Посмотреть сообщение
Не понятен вопрос. И что далее? Мы бежим по всем битам числа.
Смотрим:
00010011
Допустим смещаемся на 5 бит тогда выражение:
!((00010011 >> 5) & 1) == true
Или может я очередной раз ошибаюсь?
0
programina
2049 / 604 / 41
Регистрация: 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
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
28.10.2013, 12:20 #12
Цитата Сообщение от programina Посмотреть сообщение
проверила на ideone
Разве она не единицы считает?
0
iga7013
1 / 1 / 1
Регистрация: 02.06.2013
Сообщений: 38
28.10.2013, 12:20  [ТС] #13
Цитата Сообщение от Ilot Посмотреть сообщение
Смотрим:
00010011
Допустим смещаемся на 5 бит тогда выражение:
!((00010011 >> 5) & 1) == true
Или может я очередной раз ошибаюсь?
Двоичное число не может начинаться с нулей, на сколько я знаю...
0
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.10.2013, 12:22 #14
Цитата Сообщение от castaway Посмотреть сообщение
Разве она не единицы считает?
возвращает единицу если цифра равна нулю.
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 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
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
28.10.2013, 12:25 #16
Цитата Сообщение от iga7013 Посмотреть сообщение
Двоичное число не может начинаться с нулей, на сколько я знаю...
Ну тогда встречный вопрос, а чем заполнены старшие биты числа типа int? Единицами?
0
iga7013
1 / 1 / 1
Регистрация: 02.06.2013
Сообщений: 38
28.10.2013, 12:28  [ТС] #17
Цитата Сообщение от Ilot Посмотреть сообщение
Ну тогда встречный вопрос, а чем заполнены старшие биты числа типа int? Единицами?
Старшие биты заполнены нулями, но они не учитываются.
0
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
28.10.2013, 12:32 #18
У ForEveR цикл идет по всем битам. Собственно я больше его мнение хотел услышать...
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
28.10.2013, 12:37 #19
Ilot, Да по всем, я не особо верно понял задачу подозреваю. Посему, мой ответ не является корректным в контексте решения данной задачи.
1
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.10.2013, 18:49 #20
И биты нафик не нужны
C++
/** Подсчет нулей в числе **/
#include <iostream>
using namespace std;
 
int main()
{
    int r = 0, x = 0, g = 0;
 
    cout << "Введите число: ";
    cin >> g;
 
    cout << "Число " << g << " состоит из ";
 
    for(int h = g; ; r++, h/=10)    
        if(h == 0) break;
 
    for(int i = 1; i < r; i++, g/=10)
        if(g%10 == 0) x++;
 
    cout << r << " цифр, из которых " << x << " равны нулю.\n";
}
0
28.10.2013, 18:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2013, 18:49
Привет! Вот еще темы с решениями:

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

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

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

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


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

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

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