Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2025, 10:12   #1
vovamakarovych
Пользователь
 
Регистрация: 09.04.2019
Сообщений: 50
По умолчанию Написать собственую функцию operator[] для битов

Прочитать значение бита для конкретного индекса и модифицировать значение индекса.

Я так сделал но оно не работает. Нужна ваша помощь.
Код:
int operator[](int value, int bitIndex)
{
    return (value >> bitIndex) & 1;
}
vovamakarovych вне форума Ответить с цитированием
Старый 20.01.2025, 11:39   #2
ARTURK16
Новичок
Джуниор
 
Регистрация: 18.01.2025
Сообщений: 3
По умолчанию

Цитата:
Сообщение от vovamakarovych Посмотреть сообщение
Я так сделал но оно не работает. Нужна ваша помощь.
Код:
bool getBit(unsigned int value, int bitIndex)
{
    return (value >> bitIndex) & 1U;
}

unsigned int setBit(unsigned int value, int bitIndex)
{
    return value | (1U << bitIndex);
}

unsigned int clearBit(unsigned int value, int bitIndex)
{
    return value & ~(1U << bitIndex);
}

#include <iostream>

int main()
{
    unsigned int x = 0;
    x = setBit(x, 3);
    std::cout << "x=" << x << ", getBit(3)=" << getBit(x, 3) << "\n";
    x = clearBit(x, 3);
    std::cout << "x=" << x << ", getBit(3)=" << getBit(x, 3) << "\n";
    return 0;
}

Последний раз редактировалось ARTURK16; 20.01.2025 в 11:41.
ARTURK16 вне форума Ответить с цитированием
Старый 20.01.2025, 14:38   #3
vovamakarovych
Пользователь
 
Регистрация: 09.04.2019
Сообщений: 50
По умолчанию

Цитата:
Сообщение от ARTURK16 Посмотреть сообщение
Код:
bool getBit(unsigned int value, int bitIndex)
{
    return (value >> bitIndex) & 1U;
}

unsigned int setBit(unsigned int value, int bitIndex)
{
    return value | (1U << bitIndex);
}

unsigned int clearBit(unsigned int value, int bitIndex)
{
    return value & ~(1U << bitIndex);
}

#include <iostream>

int main()
{
    unsigned int x = 0;
    x = setBit(x, 3);
    std::cout << "x=" << x << ", getBit(3)=" << getBit(x, 3) << "\n";
    x = clearBit(x, 3);
    std::cout << "x=" << x << ", getBit(3)=" << getBit(x, 3) << "\n";
    return 0;
}
мне имено нужно написать свой operator[] для задания
vovamakarovych вне форума Ответить с цитированием
Старый 20.01.2025, 15:22   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,757
По умолчанию

Цитата:
Сообщение от vovamakarovych Посмотреть сообщение
мне имено нужно написать свой operator[] для задания
Реализуйте его через класс.
Arigato вне форума Ответить с цитированием
Старый 20.01.2025, 16:01   #5
vovamakarovych
Пользователь
 
Регистрация: 09.04.2019
Сообщений: 50
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Реализуйте его через класс.
а где можна почитать как реализовать через клас?
vovamakarovych вне форума Ответить с цитированием
Старый 20.01.2025, 16:41   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,757
По умолчанию

Если в гугле набрать "перегрузка оператора []", то можно найти ссылки.
Arigato вне форума Ответить с цитированием
Старый 20.01.2025, 19:22   #7
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 163
По умолчанию

Фактически, вам дали задание создать собственную реализацию стандартного класса std::bitset.
Посмотрите его исходный текст и сделайте упрощённо.
Идея там такая: чтобы индексатор можно было использовать в левой части выражений (то есть для модификаци бита), индексатор должен возвращать ссылку на объект (на бит). Но если у вас набор битов представлен целым числом, то не получится вернуть ссылку на бит. Поэтому в классе bitset описан вспомогательный класс, который представляет бит, и индексатор возвращает ссылку на него. А этот вспомогательный класс уже совершает операции.
DeepFlake вне форума Ответить с цитированием
Старый 23.01.2025, 20:28   #8
vovamakarovych
Пользователь
 
Регистрация: 09.04.2019
Сообщений: 50
По умолчанию

Цитата:
Сообщение от DeepFlake Посмотреть сообщение
Фактически, вам дали задание создать собственную реализацию стандартного класса std::bitset.
Посмотрите его исходный текст и сделайте упрощённо.
Идея там такая: чтобы индексатор можно было использовать в левой части выражений (то есть для модификаци бита), индексатор должен возвращать ссылку на объект (на бит). Но если у вас набор битов представлен целым числом, то не получится вернуть ссылку на бит. Поэтому в классе bitset описан вспомогательный класс, который представляет бит, и индексатор возвращает ссылку на него. А этот вспомогательный класс уже совершает операции.
в оф документации ничего не ясно( как они реализовуют
vovamakarovych вне форума Ответить с цитированием
Старый 24.01.2025, 12:12   #9
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 163
По умолчанию

Цитата:
Сообщение от vovamakarovych Посмотреть сообщение
в оф документации ничего не ясно( как они реализовуют
Я же советовал смотреть не официальную документацию, а исходный текст файла <bitset>.

Вот неэффективная реализация класса "набор битов", но можно понять суть:
набор битов в виде вектора из объектов Bit, которые представляют собой биты. В реальной коде надо вместо вектора делать машинные слова (последовательность машинных слов ) и производить битовые операции с ними.
То есть здесь неявно создаётся объект Bit, который представляет собой бит, так как нельзя возвратить ссылку на бит в машинном слове. Bit - вспомогательный класс.

Код:

#include <iostream>
#include <vector>
#include <cstddef>


class MyBitSet
{
    public:
    const std::size_t   len = 8;
    
    class Bit
    {
        public:
        explicit
            Bit( )
        {
            val = false;
        }
        
        explicit
            Bit( bool a_val )
        {
            val = a_val;
        }
        
        operator bool()
        {
            return val;
        }
        
        Bit& operator = ( bool a_val )
        {
            val = a_val;
            return *this;
        }
        
        private:
        bool    val;
    };
    
    explicit 
        MyBitSet() 
    {
        vec.assign( len, Bit( false ) );
    }
    
    Bit operator [] ( const std::size_t index ) const
    {
        return vec.at( index );
    }
    Bit& operator [] ( const std::size_t index )
    {
        return vec.at( index );
    }
    
    private:
    std::vector< Bit >  vec;
    
};


void PrintMyBitSet( const MyBitSet& bs )
{
    for ( int ind=bs.len-1; ind>=0; --ind)
    {
        std::cout << bs[ ind ] << " " ;
    }
    std::cout << std::endl;
}

int main ()
{
    MyBitSet    bs1;
    
    PrintMyBitSet( bs1 );
    bs1[0] = true;
    bs1[3] = true;
    PrintMyBitSet( bs1 );
    
    return 0;
}
Вывод программы:
Код:
0 0 0 0 0 0 0 0 
0 0 0 0 1 0 0 1
DeepFlake вне форума Ответить с цитированием
Старый 24.01.2025, 12:18   #10
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 163
По умолчанию

Оператор
Код:
 Bit operator [] ( const std::size_t index ) const
вызывается когда работаем с константным объектом MyBitSet (например в функции PrintMyBitSet),
а оператор
Код:
Bit& operator [] ( const std::size_t index )
вызывается когда модифицируем биты и читаем биты у неконстантного объекта.

В реальном коде когда биты в виде машинных слов, в теле оператора
Код:
    Bit& operator [] ( const std::size_t index )
    {
        return vec.at( index );
    }
возвращается не vec.at(), а создаётся объект Bit() и возвращается ссылка на него
DeepFlake вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализовать функцию побитового ИЛИ | между двумя файлами, записать это в один файл в обратном порядке битов на Си\С++ Диана5251 Общие вопросы C/C++ 1 09.02.2020 21:54
написать функцию, определяющую пол продавца. Используя функцию, вывести продавцов - мужчин Nuc SQL, базы данных 12 12.03.2018 10:12
[РЕШЕНО][Delphi] Ошибка 'Operator not applicable to this operator type'. Почему? Есть код. IlyaHistorik Помощь студентам 3 21.10.2017 19:37
Написать функцию подсчета суммы битов в байте abc1234 Помощь студентам 5 16.01.2013 15:38
ошибка: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char> Critter Общие вопросы C/C++ 5 08.08.2010 23:38