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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
iga7013
1 / 1 / 0
Регистрация: 02.06.2013
Сообщений: 38
28.10.2013, 11:42     Битовые операции. Сдвиг вправо и взятие остатка от деления #1
Есть задача: определить количество ноликов в веденном пользователем числе с помощью битовых операций.
Вот что у меня уже есть:


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)
нужно заменить битовыми операциями.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2013, 11:42     Битовые операции. Сдвиг вправо и взятие остатка от деления
Посмотрите здесь:

C++ Дано целое число N(>0).используя операции деления нацело и взятия остатка от деления, найти количество и сумму его цифр
Битовые операции C++
Битовые операции, битовые поля. C++
Определить результат целочисленного деления a на b, не используя стандартные операции вычисления остатка C++
Битовые операции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.10.2013, 11:49     Битовые операции. Сдвиг вправо и взятие остатка от деления #2
C++
if((x >> 1) & 0)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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;
    }
}
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
28.10.2013, 11:53     Битовые операции. Сдвиг вправо и взятие остатка от деления #4
C++
1
if ( (x & 1) == 0 )
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 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, а если старшие биты нули?
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
28.10.2013, 12:01     Битовые операции. Сдвиг вправо и взятие остатка от деления #6
Цитата Сообщение от iga7013 Посмотреть сообщение
Есть задача: определить количество ноликов в веденном пользователем числе с помощью битовых операций.
количество ноликов нужно определять в двоичном числе или десятичном?

Цитата Сообщение от programina Посмотреть сообщение
if((x >> 1) & 0)
всегда false
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 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);
ну или типа того...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
28.10.2013, 12:06     Битовые операции. Сдвиг вправо и взятие остатка от деления #8
Цитата Сообщение от Ilot Посмотреть сообщение
ForEveR, а если старшие биты нули?
Не понятен вопрос. И что далее? Мы бежим по всем битам числа.
iga7013
1 / 1 / 0
Регистрация: 02.06.2013
Сообщений: 38
28.10.2013, 12:09  [ТС]     Битовые операции. Сдвиг вправо и взятие остатка от деления #9
Цитата Сообщение от XRuZzz Посмотреть сообщение
количество ноликов нужно определять в двоичном числе или десятичном?
Количество ноликов нужно определять в двоичном числе.

Добавлено через 1 минуту
Цитата Сообщение от castaway Посмотреть сообщение
C++
1
if ( (x & 1) == 0 )
Спасибо
Все работает!
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
28.10.2013, 12:10     Битовые операции. Сдвиг вправо и взятие остатка от деления #10
Цитата Сообщение от ForEveR Посмотреть сообщение
Не понятен вопрос. И что далее? Мы бежим по всем битам числа.
Смотрим:
00010011
Допустим смещаемся на 5 бит тогда выражение:
!((00010011 >> 5) & 1) == true
Или может я очередной раз ошибаюсь?
programina
 Аватар для programina
1912 / 597 / 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;
}
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
28.10.2013, 12:20     Битовые операции. Сдвиг вправо и взятие остатка от деления #12
Цитата Сообщение от programina Посмотреть сообщение
проверила на ideone
Разве она не единицы считает?
iga7013
1 / 1 / 0
Регистрация: 02.06.2013
Сообщений: 38
28.10.2013, 12:20  [ТС]     Битовые операции. Сдвиг вправо и взятие остатка от деления #13
Цитата Сообщение от Ilot Посмотреть сообщение
Смотрим:
00010011
Допустим смещаемся на 5 бит тогда выражение:
!((00010011 >> 5) & 1) == true
Или может я очередной раз ошибаюсь?
Двоичное число не может начинаться с нулей, на сколько я знаю...
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.10.2013, 12:22     Битовые операции. Сдвиг вправо и взятие остатка от деления #14
Цитата Сообщение от castaway Посмотреть сообщение
Разве она не единицы считает?
возвращает единицу если цифра равна нулю.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 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 - я записал в двоичном виде)
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
28.10.2013, 12:25     Битовые операции. Сдвиг вправо и взятие остатка от деления #16
Цитата Сообщение от iga7013 Посмотреть сообщение
Двоичное число не может начинаться с нулей, на сколько я знаю...
Ну тогда встречный вопрос, а чем заполнены старшие биты числа типа int? Единицами?
iga7013
1 / 1 / 0
Регистрация: 02.06.2013
Сообщений: 38
28.10.2013, 12:28  [ТС]     Битовые операции. Сдвиг вправо и взятие остатка от деления #17
Цитата Сообщение от Ilot Посмотреть сообщение
Ну тогда встречный вопрос, а чем заполнены старшие биты числа типа int? Единицами?
Старшие биты заполнены нулями, но они не учитываются.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
28.10.2013, 12:32     Битовые операции. Сдвиг вправо и взятие остатка от деления #18
У ForEveR цикл идет по всем битам. Собственно я больше его мнение хотел услышать...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
28.10.2013, 12:37     Битовые операции. Сдвиг вправо и взятие остатка от деления #19
Ilot, Да по всем, я не особо верно понял задачу подозреваю. Посему, мой ответ не является корректным в контексте решения данной задачи.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2013, 18:49     Битовые операции. Сдвиг вправо и взятие остатка от деления
Еще ссылки по теме:

C++ Дано целое число (N>0), используя операции деление нацело и взятие остатка от деления, вывести все его цифры начиная с самой правой
Битовые операции и операции смещения языка С C++
Используя одну операцию деления нацело и одну операция взятия остатка от деления найти цифру. соответствующую разряду ты C++

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

Или воспользуйтесь поиском по форуму:
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 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";
}
Yandex
Объявления
28.10.2013, 18:49     Битовые операции. Сдвиг вправо и взятие остатка от деления
Ответ Создать тему
Опции темы

Текущее время: 02:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru