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

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

Войти
Регистрация
Восстановить пароль
 
 
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 670
Завершенные тесты: 2
#1

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

12.06.2014, 18:02. Просмотров 915. Ответов 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
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.06.2014, 18:22 #2
Цитата Сообщение от mat_for_c Посмотреть сообщение
Можно ли как-нибудь через биты числа А получить доступ к элементам массива Mass?
Разве число А как-то связано с массивом Mass? Или нужно просто выяснить позиции установленных битов в числе А, а потом уже на основании этих позиций задать индекс к массиву?
0
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 670
Завершенные тесты: 2
12.06.2014, 20:05  [ТС] #3
Цитата Сообщение от Tulosba Посмотреть сообщение
нужно просто выяснить позиции установленных битов в числе А, а потом уже на основании этих позиций задать индекс к массиву?
Получается, что так. Только как это реализовать?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.06.2014, 20:09 #4
Цитата Сообщение от mat_for_c Посмотреть сообщение
Только как это реализовать?
Элементарно. Хотя бы обычным сдвигом.
C++
1
2
3
4
5
int a = 5;
for( int i=0; i<sizeof(a); ++i )
{
   if( (a>>i) & 1 ) std::cout << i << std::endl; 
}
1
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 670
Завершенные тесты: 2
12.06.2014, 22:03  [ТС] #5
Цитата Сообщение от Tulosba Посмотреть сообщение
(a>>i) & 1 )
В чем смысл & 1 я понял. Меня все же смущает (a >> i). Если а = 32767, то программа выдаст только 0 1 2 3, когда должно быть 0 1 2 ... 12 13.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.06.2014, 22:16 #6
mat_for_c, результат sizeof надо еще на 8 домножить.
0
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 670
Завершенные тесты: 2
12.06.2014, 22:26  [ТС] #7
Цитата Сообщение от Tulosba Посмотреть сообщение
надо еще на 8 домножить
Тогда все сходится А есть ли какой-нибудь быстрый способ?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.06.2014, 22:47 #8
mat_for_c, а разве этот медленный?
0
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 670
Завершенные тесты: 2
12.06.2014, 23:08  [ТС] #9
Цитата Сообщение от Tulosba Посмотреть сообщение
а разве этот медленный?
Пока не знаю. Тогда сразу спрошу заодно...
На данный момент у меня самая затратная операция - это пересечение индексов массива (они упорядочены) через set_intersection (в цикле выполняется очень много раз). Подумал о таком подходе: индексы хранить в качестве битов, тем самым выиграю в пересечении через &, однако проиграю в извлечении самого индекса. Ваше мнение, так быстрее будет или нет смысла переписывать код?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.06.2014, 23:18 #10
mat_for_c, я думаю, не стоит заниматься предварительной оптимизацией. Надо сделать какую-нибудь реализацию, а если она не устроит - искать узкие места профайлером.
0
SlavaSSU
215 / 160 / 45
Регистрация: 17.07.2012
Сообщений: 587
12.06.2014, 23:19 #11
т.е. надо найти все единичные биты в числе?
обычно пишут еще так:
C++
1
2
3
4
5
for(int i = 0; i < 30; i++)
if(a && (1 << i))
{
//there is i-th bit in value a;
}
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.06.2014, 23:21 #12
SlavaSSU, только Вы спутали логическое И (&&) с побитовым (&).
0
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 670
Завершенные тесты: 2
12.06.2014, 23:21  [ТС] #13
Цитата Сообщение от Tulosba Посмотреть сообщение
искать узкие места профайлером
искал - set_intersection и есть то самое место.
0
SlavaSSU
215 / 160 / 45
Регистрация: 17.07.2012
Сообщений: 587
12.06.2014, 23:29 #14
да согласен, там тупанул. а насчет пересечения. если есть 2 множества индексов, то можно сделать из них числа, т.е. тупо перевести эти множества в числа. потом c = a & b; и где есть 1-ые биты в числе с, значит этот бит есть и в первом множестве и во втором. только я не знаю, быстрее это или нет
0
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 670
Завершенные тесты: 2
12.06.2014, 23:33  [ТС] #15
Цитата Сообщение от SlavaSSU Посмотреть сообщение
потом c = a & b
а я что имел ввиду под этим:
Цитата Сообщение от mat_for_c Посмотреть сообщение
индексы хранить в качестве битов, тем самым выиграю в пересечении через &
?

Добавлено через 1 минуту
Полагаю самый верный способ - переписать и сравнить скорость работы...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2014, 23:33
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
12.06.2014, 23:33
Ответ Создать тему
Опции темы

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