
Последние записи
- Число различных чисел (Microsoft Office Excel)
- Убить процесс
- Конвертер heic в jpg
- Проверка на шестнадцатеричный формат записи
- Отдать пользователю файл с помощью file_get_contents()
- Написать собственую функцию operator[] для битов
- Проблема с движением 2D человека
- OpenGl.Создание винтовой лестницы
- Склеить несколько файлов в один
- Windows 10 сменить администратора

Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk

Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
30th
Янв
Написать собственую функцию operator[] для битов
Posted by obzor under c/c++
Прочитать значение бита для конкретного индекса и модифицировать значение индекса.
Я так сделал но оно не работает. Нужна ваша помощь.
int operator[](int value, int bitIndex)
{
return (value >> bitIndex) & 1;
}
Фактически, вам дали задание создать собственную реализацию стандартного класса std::bitset.
Посмотрите его исходный текст и сделайте упрощённо.
Идея там такая: чтобы индексатор можно было использовать в левой части выражений (то есть для модификаци бита), индексатор должен возвращать ссылку на объект (на бит). Но если у вас набор битов представлен целым числом, то не получится вернуть ссылку на бит. Поэтому в классе 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
Оператор
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() и возвращается ссылка на него
Случайные статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту

пеллетные котлы

Пеллетный котел Emtas

Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)