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

Работа с битами. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
23.12.2010, 21:59     Работа с битами. #1
Здрасте. Дана задача: Определить на сколько в числе А больше значущих битов, что равны единице, чем битов, что равны нулю. Помогите пожалуйста. Мыслей 0. Все методические указания, что давали вообще не помогают.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2010, 21:59     Работа с битами.
Посмотрите здесь:

C++ Работа с битами
Работа с битами. C++
C++ Работа с битами И Работа с символьными данными
Работа с битами C++
C++ Работа с битами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
23.12.2010, 22:05     Работа с битами. #2
.....
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
23.12.2010, 22:13  [ТС]     Работа с битами. #3
Цитата Сообщение от sandye51 Посмотреть сообщение
.....
Спасибо. Очень содержательно.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
23.12.2010, 22: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
#include <iostream>
#include <conio.h>
#include <list>
#include <algorithm>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int num;
    list<int> blist;
 
    cout << "Введите число\n";
    cin >> num;
    do 
    {
        blist.push_back(num % 2);
        num /= 2;
    } while (num >=1);
 
    for(list<int>::reverse_iterator i = blist.rbegin(); i != blist.rend(); ++i)
        cout << *i;
    int f = count(blist.begin(), blist.end(), 1);
    cout << "\nВ битовом представлении числа " << f << " единиц и " << (blist.size() - f) << " нулей\n";
 
    _getch();
    return 0;
}
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
23.12.2010, 22:26     Работа с битами. #5
Здрасте.
Задача явно на битовые операторы. Сдвигайте вправо число, пока оно больше нуля, и сравнивайте первый бит с единицей (логическим И 1). Если 0 вычитаем единицу, если 1 -- добавляем. Если результат положительный -- единиц больше, если результат отрицательный -- нулей больше, если 0 -- поровну.
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
37
/*
  Определить на сколько в числе А больше значащих битов, что равны единице,
  чем битов, что равны нулю. Помогите пожалуйста. 
*/
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <ctime>
 
const signed int bits_diff(const int &a_number) {
  int result = 0;
  int temporary_number = a_number;
  while (temporary_number > 0) {
    result += ((temporary_number & 1)?1:-1);
    temporary_number = temporary_number >> 1;
  }
  return result;
}
 
int main(int argc, char *argv[]) {
  srand(static_cast<unsigned int>(time(NULL)));
  int a_number = rand();
  int bits_differs = bits_diff(a_number);
  printf("%d ", a_number);
 
  if (bits_differs > 0)
    printf("has %d more 1, than 0.\n", bits_differs);
  else
  if (bits_differs < 0)
    printf("has %d more 0, than 1.\n", -bits_differs);
  else
    printf("has same number of 0 and 1.\n");
 
  int exit_key;
  scanf("%d", &exit_key);
  return 0;
}
dakota412
 Аватар для dakota412
22 / 22 / 0
Регистрация: 14.02.2010
Сообщений: 50
23.12.2010, 22:35     Работа с битами. #6
я думаю сначала лучше всего определить просто количество знаков в двоичной записи числа. Например для неотрицательных чисел: Если число меньше или равно 1, то в бинарной записи только 1 знак. Если меньше или равно 3 - 2 знака, <= 7 - 3 знака. Ну и так далее. Подумай как организовать это в цикле и получить количество значащих цифр (пусть их будет n) в бинарной записи числа. Затем используй побитовый сдвиг (если не знаешь что это почитай на wiki - я в своё время именно так про это и узнал. Проделывая его n раз в цикле, каждый раз пробуй побитово умножать полуившееся число на 1 (& - операция побитового умножения, тоже если что прочти на wiki). Если будет получаться 0, то последняя цифра бинарной записи твоего числа 0 (тк 0 & 1 = 0). Если 1, то последняя цифра 1 (1 & 1 = 1). В зависимости от этого плюсуй счётчики нулей и единиц (просто создай специальные переменные для этого, скажем int nl, one). В конце ты имеешь кол-во нулей и единиц. Задача решена. Не стал писать за тебя код, ведь ты же начинающий, а я по себе знаю, что в начале нужно посидеть и самому подумать над такими вещами. Удачи тебе в изучении))
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
23.12.2010, 22:36  [ТС]     Работа с битами. #7
Ну, если честно, то по курсу, на тот момент, мы прошли только "Системы счисления", "Ввод-вывод.", "Линейные алгоритмы" и всё Но все равно большое спасибо.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
23.12.2010, 22:38     Работа с битами. #8
Цитата Сообщение от dakota412 Посмотреть сообщение
в начале нужно посидеть и подумать над такими вещами
вот именно, а не писать сразу всякую бредотню, как ты
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
23.12.2010, 22:48  [ТС]     Работа с битами. #9
"&= ". Нубский вопрос) Что означает сия операция? Если можно, то как можно проще, в методах написано конъюнкция. А что это никто не объяснил о_О. Т.е. value &= value-1 что это означает?
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
23.12.2010, 22:55     Работа с битами. #10
Sick2, побитовое умножение
т.е. если есть числа
100011
111010
то результат побитового умножения след.
100010

в общем виде
a & b = 1 <=> a == 1 && b == 1
dakota412
 Аватар для dakota412
22 / 22 / 0
Регистрация: 14.02.2010
Сообщений: 50
23.12.2010, 23:00     Работа с битами. #11
Это и есть операция поразрядного умножения про которую я написал, пусть конечно более опытные прогеры этого и не оценили. Например n&=1 это то же самое что и n = n & 1. Приведу пример в числах например 110 & 101 = 100. просто перемножаешь цифры каждого разряда и все. Первый с первым, второй со вторым и тд.
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
23.12.2010, 23:26  [ТС]     Работа с битами. #12
Ok. Вот цикл определяющий кол*во единиц.
C++
1
2
3
4
5
6
int i;
cin>>value;
for (i = 0; value != 0; value &= value-1)
{
i++;
}
Как его переделать, что бы определяло кол-во нулей =( Никак не получается.
dakota412
 Аватар для dakota412
22 / 22 / 0
Регистрация: 14.02.2010
Сообщений: 50
23.12.2010, 23:41     Работа с битами. #13
C
1
2
3
4
5
6
7
8
9
10
11
12
int nl=0;
int one  = 0;
cin>>value;
while(value)
{
if(value & 01)
     ++one;
else
     ++nl;
value>>=1;
}
*
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
23.12.2010, 23:47  [ТС]     Работа с битами. #14
Спасибо. Но что-то я ничего с этими битами не понял =((
dakota412
 Аватар для dakota412
22 / 22 / 0
Регистрация: 14.02.2010
Сообщений: 50
23.12.2010, 23:52     Работа с битами. #15
Что именно. Ты спрашивай может помогу чем. Я просто тоже начал учиться этому год назад, так что еще не успел окончательно зазнаться)))
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
23.12.2010, 23:56  [ТС]     Работа с битами. #16
Я учу 4 месяца, у нас на эту тему пол-лекции было(типа потом понадобится только). Так вот: зачем использовать здесь сдвиг?
dakota412
 Аватар для dakota412
22 / 22 / 0
Регистрация: 14.02.2010
Сообщений: 50
24.12.2010, 00:04     Работа с битами. #17
Ну ты понимаешь что это такое? Ты как бы прогоняеш перед собой двоичную запись числа. Например есть число 11011001. Если если его поразрядно помножено на 1, то будет 1 (ведь ты умножаешь на 1 последнюю цифру, а все остальное получается на 0). Значит последняя цифра 1. Дальше ты делаешь сдвиг. Сдвигаешь все на одну цифру вправо. Получается 1101100. Если это поразрядно умножить на 1 будет 0. Значит последняя цифра 0. Так мы двигаем пока от числа не останется 0. В этот момент цикл прервется. Вот вобщем то и все. А где учишься то?
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
24.12.2010, 00:12  [ТС]     Работа с битами. #18
Я понимаю, что это такое Но не понимал, для чего это надо в поставленной задаче. Теперь понял спасибо =)
Ээ..я из Беларуси В ней и учусь))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2010, 00:16     Работа с битами.
Еще ссылки по теме:

Работа с битами C++
работа с битами C++
Работа с битами C++

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

Или воспользуйтесь поиском по форуму:
dakota412
 Аватар для dakota412
22 / 22 / 0
Регистрация: 14.02.2010
Сообщений: 50
24.12.2010, 00:16     Работа с битами. #19
Ладно, удачи тебе)) я уверен, что через год будешь такие вещи влегкую делать)) и еще и не такие))
Yandex
Объявления
24.12.2010, 00:16     Работа с битами.
Ответ Создать тему
Опции темы

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