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

Задача на биты. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
Ferus
0 / 0 / 0
Регистрация: 21.11.2011
Сообщений: 13
21.11.2011, 02:21     Задача на биты. #1
Здраствуйте. С++ начал изучать недавно. И возникла проблема с решением задачи на биты. Вот собственно сама задача. Пока я выучил только темы Ввод-Вывод и Линейные алгоритмы. На основе этого я должен решить задачу.
Вот собственно сама задача.

Ввести целое A и посчитать сколько нулей в числе с третьего по 13 бит, включая эти биты.

Может сможете объяснить как же ее решить и немного пояснить. Буду премного благодарен. Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
21.11.2011, 08:15     Задача на биты. #2
с учетом того что первый бит нумеруется как нулевой, а процессор х32
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
#include <stdio.h>
 
int main()
{
    unsigned int x = 123456789, tmp = 0, n, m = 13;
    n = x;
    x >>= 3;
    x <<= 16;
    x >>= 16;
 
    while ( m )
    {
        if ( !(x & 1) )
            ++tmp;
        x >>= 1;
        --m;
    }
 
    printf("нулей с 3 по 13 биты = %d\n", tmp);
    printf("число х = ");
 
    tmp = 0; x = n;
    while ( x )
    {
        printf("%d", ((x & 0x80000000) >> 31));
        x <<= 1;
    }
    puts("");
 
    return 0;
}
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
21.11.2011, 08:49     Задача на биты. #3
alkagolik, сложное решение получилось.
Биты нумеруются с первого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
int main(int argc, char *argv[]) {
  int firstCountableBit = 3;
  int lastCountableBit = 13;
  int number;
  std::cout << "Enter number: ";
  std::cin >> number;
  int zeroes = 0;
 
  // подсчет основан на приведении типов
  // работает, потому что истинным считается любое значение, кроме нуля
  // и истинное значение переводится в единицу при числовом вычислении.
  for (int i = firstCountableBit - 1; i < lastCountableBit; ++i)
    zeroes += !(number & (1 << i));
    // более надежно использовать оператор "?"
    //zeroes += (number & (1 << i)) ? 0 : 1;
 
  std::cout << number << " haz " << zeroes << " zero bit(s) from bit " <<
    firstCountableBit << " up to bit " << lastCountableBit << " inclusive." <<
    std::endl;
  return 0;
}
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
21.11.2011, 09:21     Задача на биты. #4
Биты нумеруются с нуля.
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
35
36
#include <stdio.h>
#include <stdlib.h>
 
int main( int argc, char *argv[] ) {
 
unsigned A;
int count;
 
 
argc--;
argv++;
 
if ( argc<1 ) {
    fprintf( stderr, "Usage: prog number\n" );
    exit( 2 );
}
A= (unsigned)atol( argv[0] );
 
count=
((A&0x00000008)?0:1) +
((A&0x00000010)?0:1) +
((A&0x00000020)?0:1) +
((A&0x00000040)?0:1) +
((A&0x00000080)?0:1) +
((A&0x00000100)?0:1) +
((A&0x00000200)?0:1) +
((A&0x00000400)?0:1) +
((A&0x00000800)?0:1) +
((A&0x00001000)?0:1) +
((A&0x00002000)?0:1);
 
printf( "A=%u\n" "count=%d\n", A, count );
 
return 0;
 
} /* main() */
Добавлено через 1 минуту
Код
> prog.exe 12345678
A=12345678
count=7
Добавлено через 48 секунд
Тупо пересчитываем все биты без всяких циклов
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.11.2011, 12:47     Задача на биты. #5
Цитата Сообщение от Ferus
Ввести целое A и посчитать сколько нулей в числе с третьего по 13 бит, включая эти биты.
нужно сдвинуть этот фрагмент к краю и посчитать единичные биты, продолжая сдвигать

Цитата Сообщение от odip
Тупо пересчитываем все биты без всяких циклов
и тут препод даёт задание посчитать, сколько нулей в числе с 12 по 7 бит
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
21.11.2011, 13:45     Задача на биты. #6
и тут препод даёт задание посчитать, сколько нулей в числе с 12 по 7 бит
И что ?
Нетрудно изменить
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
21.11.2011, 17:57     Задача на биты. #7
Цитата Сообщение от odip Посмотреть сообщение
Тупо пересчитываем все биты без всяких циклов
не комильфо, тоже что и сквозными кейсами. Чем цикл не в тему?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int main()
{
    unsigned int x = 123456789, tmp = 0, m = 0x00000008;
 
    while ( m <= 0x00002000 )
    {
        tmp += (x & m) ? 0 : 1;
        m <<= 1;
    }
 
    printf("нулей с 3 по 13 биты = %d\n", tmp);
    puts("");
 
    return 0;
}
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.11.2011, 22:34     Задача на биты. #8
Цитата Сообщение от odip
И что ?
Нетрудно изменить
так не делается, не пишется пятьсот программ для пятиста задач
делается одна функция

Цитата Сообщение от alkagolik
Чем цикл не в тему?
да он просто не врубается, как из готовых функций собрать любую программу за пару часов
Ferus
0 / 0 / 0
Регистрация: 21.11.2011
Сообщений: 13
28.11.2011, 12:37  [ТС]     Задача на биты. #9
Всем спасибо. Но мне нужно решить задачу бес использлвания битов, как я понял мне нужно такое решение как советует accept :

Цитата Сообщение от accept Посмотреть сообщение
нужно сдвинуть этот фрагмент к краю и посчитать единичные биты, продолжая сдвигать

Можете помочь?
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
28.11.2011, 12:50     Задача на биты. #10
Цитата Сообщение от Ferus
Ввести целое A и посчитать сколько нулей в числе с третьего по 13 бит, включая эти биты.
приведи пример
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2011, 12:51     Задача на биты.
Еще ссылки по теме:

Выравнивающие биты в BMP C++
C++ Задача про биты
C++ Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат

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

Или воспользуйтесь поиском по форуму:
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
28.11.2011, 12:51     Задача на биты. #11
так не делается, не пишется пятьсот программ для пятиста задач
делается одна функция
Это тестовые задания
Тут чем проще - тем лучше
Поставлена задача такая - вот такую и решает
А не думаем про 100 других задач, которым нам могут задать

Можете помочь?
В посте #2 есть решение со сдвигами к краю
Yandex
Объявления
28.11.2011, 12:51     Задача на биты.
Ответ Создать тему
Опции темы

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