Переменная, как набор битов.
Подскажите каким образом
можно в целочисленной
переменной обращаться,
как к двоичному числу, к
каждому биту отдельно.
Примерно так же, как к
элементам массива.
Заранее спасибо.
1. Можете использовать битовые поля
{
unsigned char Byte;
#pragma pack(1)
struct
{
bool Bit0: 1;
bool Bit1: 1;
bool Bit2: 1;
bool Bit3: 1;
bool Bit4: 1;
bool Bit5: 1;
bool Bit6: 1;
bool Bit7: 1;
};
#pragma pack()
};
//использование
BitFieldsTest u;
u.Byte = your_value;
cout << u.Bit4 << endl;
2. Еще вариант - std::bitset
std::bitset< sizeof(your_value) * 8 > bs(your_value);
cout << bs[4] << endl;
1. Можете использовать битовые поля
{
unsigned char Byte;
#pragma pack(1)
struct
{
bool Bit0: 1;
bool Bit1: 1;
bool Bit2: 1;
bool Bit3: 1;
bool Bit4: 1;
bool Bit5: 1;
bool Bit6: 1;
bool Bit7: 1;
};
#pragma pack()
};
//использование
BitFieldsTest u;
u.Byte = your_value;
cout << u.Bit4 << endl;
2. Еще вариант - std::bitset
std::bitset< sizeof(your_value) * 8 > bs(your_value);
cout << bs[4] << endl;
Спасибо конечно, но это не совсем то, что мне надо. Мне нужно объявить двойное слово и в генерировать в нём в каждый нужный момент случайное значение. Но мне нужно не его десятичное значение, а его двоичная форма. Мне важен каждый бит. В каждый нужный мне момент мне нужен или ноль, или еденица по каждому биту. Нужно случайное количество этих самых значений, а с битовой маской так не выдет.
[COLOR="#808080"]P.S.Что за странная манера писать посты как стихи–уписывая их в узкий-узкий столбец?[/COLOR]
[COLOR="#808080"]P.S.Что за странная манера писать посты как стихи–уписывая их в узкий-узкий столбец?[/COLOR]
А со стоками это интересно, точнее с-сроки. Спасибо, как то даже не подумал об этом.
А за манеру письма в посте извините. С телефона пишу видно потому и получается таким.
Человек хочет что-то такое:
return (v>>bit) & 1;
}
void write(int& v, int bit, bool value) {
if (value)
v |= (1<<bit);
else
v &= ~(1<<bit)
}
Человек хочет что-то такое:
return (v>>bit) & 1;
}
void write(int& v, int bit, bool value) {
if (value)
v |= (1<<bit);
else
v &= ~(1<<bit)
}
Отличный пример того как писать не следует.
Почему?
Я иногда такое использовал в олимпиадных задачах. Разве что для ускорения работы программы не делал для этих операций отдельных функций.
Вы будете удивлены написав сие на ассемблере да так и не получив ожидаемой "скорости".
Я иногда такое использовал в олимпиадных задачах. Разве что для ускорения работы программы не делал для этих операций отдельных функций.
Как минимум, радость от сего кода на граничных условиях будет особенно хороша и не предсказуема ибо читаем стандарт.
Какие граничные условия? Ноль? Отрицательные числа? Имеется в виду, что у отрицательных чисел после сдвига в старший бит записывается 1? Но в данном случае это не может никак помешать.
Битовые операции - одни из наиболее быстрых операций. Работать это должно быстрее, чем обычное обращение к массиву.
Я полагаю, что если откомпилировать вариант Нездешнего и посмотреть ассемблерное представление, то окажется, что реализуется оно опять же через битовые сдвиги.
Какие граничные условия? Ноль? Отрицательные числа? Имеется в виду, что у отрицательных чисел после сдвига в старший бит записывается 1? Но в данном случае это не может никак помешать.
Битовые операции - одни из наиболее быстрых операций. Работать это должно быстрее, чем обычное обращение к массиву.
Я полагаю, что если откомпилировать вариант Нездешнего и посмотреть ассемблерное представление, то окажется, что реализуется оно опять же через битовые сдвиги.
Да согласен битовые операции наиболее быстрые, но опять же в асме. Они и используются в нём вместо операции умножения и выполняются на несколько порядков быстрей. А в языках высокого уровня компилятор создаёт избыточный код при работе с отдельными битами и из-за этого они теряют свою скорость. Он и придуман чтоб облегчить жизнь программисту, чтобы он не тратил своё время на такты а работал с готовыми функциями и объектами. И дело тут вовсе не в ноле и не в отрицательных числах, да и разницы вовсе нет отрицательное оно или положительное.
Берем кусочек кода на Си:
a = (b<<c)&1;
Компилируем и смотрим, что получилось:
movl -16(%rbp), %edx // вытаскивается в регистр "b"
movl %edx, %ebx
.cfi_offset 3, -24
movl %eax, %ecx
sall %cl, %ebx // битовый сдвиг
movl %ebx, %eax
andl $1, %eax // битовое И
movl %eax, -20(%rbp) // результат пихается в "a"
Битовая операция Си транслируется в одну команду процессору.
И где вы тут видите избыточный код, на порядок замедляющий битовые операции?
bool read
(int v,
int bit)
{
return
(v>>bit)
& 1;
}
только в цикл надо вставить А я сижу за битовые поля рассказываю.
Устал уже наверно, уже третий день все эти пертурбации на бумаге считаю. Проверить не где, до компа только завтра доберусь.