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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2022, 12:40   #1
moi_arahis
Новичок
Джуниор
 
Регистрация: 17.06.2022
Сообщений: 2
По умолчанию Битовые операции (с++)

Добрый день. Есть задача "Вводится 4-х байтовое число. Осуществить циклический сдвиг в 3 байте на 2 бита влево.".
Собственно, проблема в том, что на лекциях мы такого не проходили, а сам я в интернете внятного объяснения не нашёл. Что должно происходить я понимаю, но как записать в с++ 4х байтовое и работать с отдельным байтом числа не могу понять.
Прошу выложить ссылку на внятную теорию (так сказать, для чайников) и, если есть, пример кода с битовыми операциями на отдельных байтах.
Спасибо.

P.S. Читал, что люди используют char, но в него помещается всего 1 байт.

P.P.S. Разобрался с вводом числа, осталось только сделать сдвиг в 3 байте. Код пока такой:
Код:
 
#include <iostream>
#include <iomanip>
#include <string>
#include <cmath>
#include <bitset>
 
using namespace std;
 
int main(){
 
    uint32_t ch;
 
    cin >> ch;
    cout << bitset<sizeof(ch) * 8>(ch) << endl;
 
    return 0;
}

Последний раз редактировалось moi_arahis; 17.06.2022 в 13:05.
moi_arahis вне форума Ответить с цитированием
Старый 17.06.2022, 13:07   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Можно использовать указатели, чтобы считать одно 4байтовое число массивом из 4 char. А можно использовать битовые маски, чтобы выделить нужный байт, подвигать его, занулить под него место и вставить обратно (примерно так):
Код:
uint32_t val = 0x1234;
uint32_t b = val & 0x0F00;
val &= 0xF0FF;
val |= ((b << 2) | (b >> 6)) & 0x0F00;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.06.2022, 14:04   #3
moi_arahis
Новичок
Джуниор
 
Регистрация: 17.06.2022
Сообщений: 2
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Можно использовать указатели, чтобы считать одно 4байтовое число массивом из 4 char. А можно использовать битовые маски, чтобы выделить нужный байт, подвигать его, занулить под него место и вставить обратно (примерно так):
Код:
uint32_t val = 0x1234;
uint32_t b = val & 0x0F00;
val &= 0xF0FF;
val |= ((b << 2) | (b >> 6)) & 0x0F00;
Попробовал сначала маской убрать третий бит, но почему-то маска убирает два бита, а не один. Что-то делаю не так, но что - не пойму, раньше масками не пользовался. Пробовал разные маски ставить, какой бы байт не занулял-маска зануляет его и все байты выше него.

Код:
int main(){ //1431655765

    uint32_t ch;


    setlocale(LC_ALL, "Russian");
    cout << "Введите число: ";
    cin >> ch;
    uint32_t b = ch & 0x00F0;

    cout << "Введённое число:" << ch << endl << "Двоичное представление введённого числа: " << bitset<sizeof(ch) * 8>(ch) << endl;

    //Тут должен быть код по циклическому сдвигу
    ch &= 0xFF0F;
    //ch |= (b) & 0x00F0;


    cout << endl << "Двоичное представление полученного числа: " << bitset<sizeof(ch) * 8>(ch) << endl << "Полученное число:" << ch << endl;
    return 0;
}
Изображения
Тип файла: png vloj.png (23.6 Кб, 1 просмотров)
moi_arahis вне форума Ответить с цитированием
Старый 17.06.2022, 16:31   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Маски это обычные числа, но они используют свое двоичное представление. А также логические операции
Код:
 0 = 0x0 = 0000b
 1 = 0x1 = 0001b
 2 = 0x2 = 0010b
 3 = 0x3 = 0011b
 4 = 0x4 = 0100b
 5 = 0x5 = 0101b
 6 = 0x6 = 0110b
 7 = 0x7 = 0111b
 8 = 0x8 = 1000b
 9 = 0x9 = 1001b
10 = 0xA = 1010b
11 = 0xB = 1011b
12 = 0xC = 1100b
13 = 0xD = 1101b
14 = 0xE = 1110b
15 = 0xF = 1111b

10 | 3 = 0xA | 0x3 = 1010 | 0011 ->
1010
0011
----
1011 = 11 = 0xB

9 & 5 = 0x9 & 0x5 = 1001 & 0101 ->
1001
0101
----
0001 = 1 = 0x1

10 ^ 6 = 0xA ^ 0x6 = 1010 ^ 0110 ->
1010
0110
----
1100 = 12 = 0xС
В столбик приводится работа только операций C++ для двух чисел. Но функций всего 16, а не 3. Подробнее смотрите здесь

Байты же состоят из 2 кусочков (не понимаю зачем в булеву алгебру притащили англицизм ниббл = англ. nibble пер. огрызок, кусок), но приведенный BDA пример работает со 1 байтом (2 кусочком).
Для работы с 3 байтом нужна другая маска
Код:
v- 31 бит               бит 0 -v
01110110010101000011001000010000 = 0x76543210 = 1985229328
|3 байт^|2 байт^|1 байт^|0 байт^
Байты в примере выше начинаются с ^ и заканчиваются на | включительно

Последний раз редактировалось macomics; 17.06.2022 в 17:02.
macomics вне форума Ответить с цитированием
Старый 17.06.2022, 18:51   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Извиняюсь, ошибся в маске. Маска F покрывает только 4 бита, т.е. половину байта.
Код:
uint32_t val = 0x12345678;
uint32_t b = val & 0x00FF0000;
val &= 0xFF00FFFF;
val |= ((b << 2) | (b >> 6)) & 0x00FF0000;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Битовые операции Александр Шатило Общие вопросы C/C++ 5 22.02.2015 16:30
Битовые операции в PHP kpachbiu PHP 1 13.12.2013 16:14
Битовые операции WizarD.89 Общие вопросы C/C++ 5 23.11.2012 16:40
Битовые операции _-Re@l-_ Свободное общение 12 11.07.2010 15:31
Битовые операции ("")(Э_Є)("") Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 04.07.2009 13:19