Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
mat_for_c
165 / 160 / 34
Регистрация: 26.04.2013
Сообщений: 729
Завершенные тесты: 3
#1

Обращение к элементам массива через биты некоторого числа - C++

12.06.2014, 18:02. Просмотров 960. Ответов 28
Метки нет (Все метки)

Пусть есть массив Mass из 10 элементов и число А = 510 = 0...0 01012. Мне надо обратиться к 0 и 2 элементам (или к 7 и 9 - это как посмотреть) массива Mass. Можно ли как-нибудь через биты числа А получить доступ к элементам массива Mass?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2014, 18:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обращение к элементам массива через биты некоторого числа (C++):

Обращение к элементам динамического массива через указатели - C++
Само задание написано внизу в коментарии! Заранее спасибо! #include <conio.h> #include <stdio.h> #include <iostream> using...

Обращение к элементам линейного списка через элементы массива указателей - C++
Вот полная версия программы. Компилятор не выдаёт ошибок, но при выполнении, судя по всему, на строчке 278, при попытке обратится к...

Обращение к элементам класса через [] - C++
Пишу класс для работы с комплексными числами, почти все готово, осталось только 1 задание.

Обращение к элементам массива в C++ - C++
#include <SFML\Graphics.hpp> const int number_units = 1; Sprite Person; Sprite unitsSprite = { Person }; for (int i = 0; i <...

массив классов, задание и обращение к элементам через указатель - C++
Доброе время суток!! Помогите новичку разобраться с классами! Очень надо как всегда:) Задан класс class A { int m; ...

Обращение к элементам массива структур - C++
Вводим n-ое количество имен и количество оценок каждому из имен.(студент - оценки) #include <iostream> using namespace std; ...

28
SlavaSSU
216 / 161 / 45
Регистрация: 17.07.2012
Сообщений: 587
12.06.2014, 23:35 #16
погоди! я не понял что дано! каждый раз тебе даны 2 числа, ты должен получить по этим числам индексы в массиве и найти пересечение индексов? или как?
0
mat_for_c
165 / 160 / 34
Регистрация: 26.04.2013
Сообщений: 729
Завершенные тесты: 3
12.06.2014, 23:39  [ТС] #17
Цитата Сообщение от SlavaSSU Посмотреть сообщение
каждый раз тебе даны 2 числа
2 множества индексов, их пересекаю и работаю в массиве только по пересеченным индексам
0
SlavaSSU
216 / 161 / 45
Регистрация: 17.07.2012
Сообщений: 587
12.06.2014, 23:45 #18
1)а как тебе даны множества???
сначала размер, а потом сами индексы, и аналогично для 2 множества?
вот тут не пойму!

2)и ты пихаешь в 1-ый сет первое множество, пихаешь во 2-ой сет индексы 2 множества и потом делаешь intersect?
0
mat_for_c
165 / 160 / 34
Регистрация: 26.04.2013
Сообщений: 729
Завершенные тесты: 3
12.06.2014, 23:51  [ТС] #19
индексы я формурую в зависимости от условий. кидаю их в разные вектора (их довольно много ~ 3000). Потом беру нужные 2 вектора с индексами, делаю пересечение, работаю с массивом, сохраняю пересечение и опять все по новой. и так много раз...
Цитата Сообщение от SlavaSSU Посмотреть сообщение
2)и ты пихаешь в 1-ый сет первое множество, пихаешь во 2-ой сет индексы 2 множества и потом делаешь intersect?
типа того, только в вектор
0
SlavaSSU
216 / 161 / 45
Регистрация: 17.07.2012
Сообщений: 587
13.06.2014, 00:01 #20
ага понятно!
я так понимаю изначально даны все множества?

тогда вот так можно сделать:

множество индексов не кидай в вектора, а делай из них число.

вот пусть дано множество и в нем n индексов, тогда получить число можно так.
вот ты считываешь все множества
C++
1
2
3
4
5
6
7
8
9
10
11
for(int j = 1; j <= cnt; j++)
{
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
int idx;
cin >> idx;
mask[j] |= (1 << idx);
}
}
теперь в mask[j] хранятся индексы j-ого множества.

все отлично теперь у тебя множества хранятся тупо как числа.

ну все. пусть теперь надо пересечь i-ое и j-ое множества.

делаешь int Mask = mask[i] & mask[j];

и теперь все единичные биты в числе Mask - это и есть биты пересечения!
0
mat_for_c
165 / 160 / 34
Регистрация: 26.04.2013
Сообщений: 729
Завершенные тесты: 3
13.06.2014, 00:05  [ТС] #21
А как такое? По сути должно побыстрее работать, т.к. не надо бегать по всем битам
C++
1
2
3
4
5
6
int A = 123, B, i = 0;
while ((B = (1 << i)) < A) {
   if (B & A)
      // good
   ++i;
}
0
SlavaSSU
216 / 161 / 45
Регистрация: 17.07.2012
Сообщений: 587
13.06.2014, 00:13 #22
это ты так определил все 1-ые биты в А?
ну это не намного быстрее.
если уже сильно хочется, то можно и тот фор переписать!
C++
1
2
3
4
5
6
7
for(int i = 0; i < 30 && (1 << i) <= A; i++)
{
if(A & (1 << i))
{
//good
}
}
еще можешь почитать про битовые маски и про класс bitset в с++
1
mat_for_c
165 / 160 / 34
Регистрация: 26.04.2013
Сообщений: 729
Завершенные тесты: 3
13.06.2014, 12:54  [ТС] #23
Цитата Сообщение от SlavaSSU Посмотреть сообщение
про класс bitset
Он конечно хорош, однако для него нужно указывать размер - константу. А вот я его изначально не знаю...
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.06.2014, 13:23 #24
Цитата Сообщение от mat_for_c Посмотреть сообщение
А вот я его изначально не знаю...
Ну тогда vector<bool> в помощь.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
13.06.2014, 13:30 #25
Цитата Сообщение от mat_for_c Посмотреть сообщение
Он конечно хорош, однако для него нужно указывать размер - константу.
boost::dynamic_bitset
2
Kuzia domovenok
2030 / 1874 / 168
Регистрация: 25.03.2012
Сообщений: 6,451
Записей в блоге: 1
13.06.2014, 14:21 #26
Чем обычный стд::set не угодил?
0
mat_for_c
165 / 160 / 34
Регистрация: 26.04.2013
Сообщений: 729
Завершенные тесты: 3
13.06.2014, 14:43  [ТС] #27
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
стд::set
Цитата Сообщение от Tulosba Посмотреть сообщение
vector<bool>
я так понимаю там операции & только в циклах выполнять ?
0
Kuzia domovenok
2030 / 1874 / 168
Регистрация: 25.03.2012
Сообщений: 6,451
Записей в блоге: 1
13.06.2014, 14:48 #28
Есть ещё sеt_intеrsеction, или как-то так...
0
mat_for_c
165 / 160 / 34
Регистрация: 26.04.2013
Сообщений: 729
Завершенные тесты: 3
13.06.2014, 14:54  [ТС] #29
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Есть ещё sеt_intеrsеction
Через него дольше работать будет, чем сейчас. Если я работаю с set_intersection для индексов массива (а их меньше, чем его длина), то для set и vector будет еще дольше, т.к. придется задействовать всю длину.
0
13.06.2014, 14:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2014, 14:54
Привет! Вот еще темы с ответами:

Обращение к элементам двухмерного динамического массива - C++
Строки в двумерном динамическом массиве расположены не вплотную друг к другу. Тогда почему чтобы получить значение из массива оператор ar...

Осуществить обращение к элементам массива по указателю - C++
Здравствуйте. Каким образом можно изменить код, чтобы обращение к переменным и элементам массива осуществлялся через указатели (например,...

Обращение к элементам массива используя указатель - C++
Необходимо написать программу, выделив под массив динамически память. Обращаться к элементам массива необходимо используя указатель. ...

Косвенное обращение к элементам динамического массива - C++
Доброго времени суток. Необходима помощь с программой. Текст задачи: Заданы два массива А(5) и В(4). Первым на печать вывести массив,...


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

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

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