14 / 14 / 6
Регистрация: 26.11.2010
Сообщений: 235
1

Работа с битами.

23.12.2010, 21:59. Показов 2853. Ответов 18
Метки нет (Все метки)

Здрасте. Дана задача: Определить на сколько в числе А больше значущих битов, что равны единице, чем битов, что равны нулю. Помогите пожалуйста. Мыслей 0. Все методические указания, что давали вообще не помогают.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2010, 21:59
Ответы с готовыми решениями:

Работа с битами И Работа с символьными данными
1. Ввести 8 символов. В символе с наибольшим кодом заменить 5-й бит единицей, а в символе с...

Работа с битами
три раза писал но все равно не получается((( 1-)Ввести последовательность из 8 символов. Сравнить...

Работа с битами
Стоит задача: вывести все двоичные коды чисел от 0 и до 2n-1. Сделать напролом могу(переводить в...

Работа с битами
В общем вот локальная проблема: есть int, который выступает в роли сетки нулей и единиц, два...

18
программист С++
841 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
23.12.2010, 22:05 2
.....
0
14 / 14 / 6
Регистрация: 26.11.2010
Сообщений: 235
23.12.2010, 22:13  [ТС] 3
Цитата Сообщение от sandye51 Посмотреть сообщение
.....
Спасибо. Очень содержательно.
0
программист С++
841 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
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;
}
1
3932 / 1991 / 719
Регистрация: 29.11.2010
Сообщений: 4,272
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;
}
1
22 / 22 / 1
Регистрация: 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). В конце ты имеешь кол-во нулей и единиц. Задача решена. Не стал писать за тебя код, ведь ты же начинающий, а я по себе знаю, что в начале нужно посидеть и самому подумать над такими вещами. Удачи тебе в изучении))
0
14 / 14 / 6
Регистрация: 26.11.2010
Сообщений: 235
23.12.2010, 22:36  [ТС] 7
Ну, если честно, то по курсу, на тот момент, мы прошли только "Системы счисления", "Ввод-вывод.", "Линейные алгоритмы" и всё Но все равно большое спасибо.
0
программист С++
841 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
23.12.2010, 22:38 8
Цитата Сообщение от dakota412 Посмотреть сообщение
в начале нужно посидеть и подумать над такими вещами
вот именно, а не писать сразу всякую бредотню, как ты
0
14 / 14 / 6
Регистрация: 26.11.2010
Сообщений: 235
23.12.2010, 22:48  [ТС] 9
"&= ". Нубский вопрос) Что означает сия операция? Если можно, то как можно проще, в методах написано конъюнкция. А что это никто не объяснил о_О. Т.е. value &= value-1 что это означает?
0
программист С++
841 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
23.12.2010, 22:55 10
Sick2, побитовое умножение
т.е. если есть числа
100011
111010
то результат побитового умножения след.
100010

в общем виде
a & b = 1 <=> a == 1 && b == 1
0
22 / 22 / 1
Регистрация: 14.02.2010
Сообщений: 50
23.12.2010, 23:00 11
Это и есть операция поразрядного умножения про которую я написал, пусть конечно более опытные прогеры этого и не оценили. Например n&=1 это то же самое что и n = n & 1. Приведу пример в числах например 110 & 101 = 100. просто перемножаешь цифры каждого разряда и все. Первый с первым, второй со вторым и тд.
0
14 / 14 / 6
Регистрация: 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++;
}
Как его переделать, что бы определяло кол-во нулей =( Никак не получается.
0
22 / 22 / 1
Регистрация: 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;
}
*
1
14 / 14 / 6
Регистрация: 26.11.2010
Сообщений: 235
23.12.2010, 23:47  [ТС] 14
Спасибо. Но что-то я ничего с этими битами не понял =((
0
22 / 22 / 1
Регистрация: 14.02.2010
Сообщений: 50
23.12.2010, 23:52 15
Что именно. Ты спрашивай может помогу чем. Я просто тоже начал учиться этому год назад, так что еще не успел окончательно зазнаться)))
0
14 / 14 / 6
Регистрация: 26.11.2010
Сообщений: 235
23.12.2010, 23:56  [ТС] 16
Я учу 4 месяца, у нас на эту тему пол-лекции было(типа потом понадобится только). Так вот: зачем использовать здесь сдвиг?
0
22 / 22 / 1
Регистрация: 14.02.2010
Сообщений: 50
24.12.2010, 00:04 17
Ну ты понимаешь что это такое? Ты как бы прогоняеш перед собой двоичную запись числа. Например есть число 11011001. Если если его поразрядно помножено на 1, то будет 1 (ведь ты умножаешь на 1 последнюю цифру, а все остальное получается на 0). Значит последняя цифра 1. Дальше ты делаешь сдвиг. Сдвигаешь все на одну цифру вправо. Получается 1101100. Если это поразрядно умножить на 1 будет 0. Значит последняя цифра 0. Так мы двигаем пока от числа не останется 0. В этот момент цикл прервется. Вот вобщем то и все. А где учишься то?
0
14 / 14 / 6
Регистрация: 26.11.2010
Сообщений: 235
24.12.2010, 00:12  [ТС] 18
Я понимаю, что это такое Но не понимал, для чего это надо в поставленной задаче. Теперь понял спасибо =)
Ээ..я из Беларуси В ней и учусь))
0
22 / 22 / 1
Регистрация: 14.02.2010
Сообщений: 50
24.12.2010, 00:16 19
Ладно, удачи тебе)) я уверен, что через год будешь такие вещи влегкую делать)) и еще и не такие))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2010, 00:16
Помогаю со студенческими работами здесь

Работа с битами
Не могу понять, почему не правильно работает программа. Программа зашифровывает строку, выводит,...

Работа с битами
Я уже задолбался... :wall: Может мне кто нибудь подскажет как из 00111010 (58) получить...

работа с битами
доброй ночи, форумчане, необходима ваша помощь) как и всем тут... вот изучаю с++ и добрался до...

Работа с битами.
помогите!! как писать эту на программе с++ Ввести последовательность из 8 символов. Сравнить 5-й...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru