Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
2 / 0 / 1
Регистрация: 12.11.2014
Сообщений: 33

Работа с битами. Сдвиг бит в массиве переменных. О как

31.12.2014, 15:43. Показов 5398. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.. Задача такая..
Есть небольшой массив (пусть будет размер три)

Добавлено через 11 минут
Всем привет.. Задача такая..
Есть небольшой массив (пусть будет размер три)
В нем несколько значение
10 04 31 в 16

то есть
arr[0] = 0b00010000 - 10
arr[1] = 0b00000100 - 04
arr[2] = 0b00110001 - 31

нужно считать сначала определенное количество бит некоторой меняющейся маской (пусть будет первые пять бит mask = 0b00011111)
причем после окончания считывания мы должны все сдвинуть на количество бит, равное этой маске.
короче говоря должно получится вот так.

переменная в которую мы считали A=0b00010000


arr[0] = 00100 000 10000 - остаток в переменную А
arr[1] = 10001 000 00100 - остаток в переменную arr[0]
arr[2] = 00000 001 10001 - остаток в переменную arr[1]


причем сдвинули так, что остаток добавился вначало предыдущей переменной

как это сделать в цикле с использованием стандартных плюшек С/С++
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.12.2014, 15:43
Ответы с готовыми решениями:

Работа с битами: как просмотреть и изменить заданный бит в переменной типа char?
Есть переменная типа char, как посмотреть в нем биты и изменять их?

Работа с битами числа - установка, сдвиг, инверсия
Здача: 1. Установить в 1 все биты младшего байта 2. циклично сдвинуть все байты вправо на 4 бита 3. Обратить 0,2,11,15 биты ...

Логический сдвиг влево,логический сдвиг вправо,алгоритм обмена двух переменных,циклический сдвиг
Битовые сдвиги.FW4,msstudio 13,на C# 1)Реализовать быстрое умножение на 2(логический сдвиг влево) 2)Реализовать быстрое деление на...

10
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
31.12.2014, 15:48
Определяешь старший бит, если = 1 то к следующему байту прибавляешь после сдвига.
0
2 / 0 / 1
Регистрация: 12.11.2014
Сообщений: 33
31.12.2014, 15:51  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Определяешь старший бит, если = 1 то к следующему байту прибавляешь после сдвига.
Не очень понятно. Можно подробнее?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
31.12.2014, 15:57
Сдвиг на 1 бит от a[0] к a[2].
C++
1
2
3
4
5
6
7
8
9
10
char a[3], c = 0, nc;
 
for (int i = 0; i < 3; ++i)
{
    if (a[i] & 0x80 != 0) nc = 1;
    else nc = 0;
    a[i] <<= 1;
    a[i] |= c;
    c = nc;
}
1
2 / 0 / 1
Регистрация: 12.11.2014
Сообщений: 33
31.12.2014, 16:19  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Сдвиг на 1 бит от a[0] к a[2].
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "GIF.h"
 
int main(){
 
BYTE a[3];
 
a[0] = 0b00010000;
a[1] = 0b00000100;
a[2] = 0b00110001;
 
 
BYTE c = 0, nc;
 
for (int i = 0; i < 3; ++i){
    if ((a[i] & 0x80) != 0) nc = 1;
    else nc = 0;
    a[i] <<= 1;
    a[i] |= c;
    c = nc;
}
    for (int i = 0; i < 3; ++i){
        printf ("%02X ",a[i]);
    }
    
    
/* ВЫВОД ТАКОЙ 20 08 62
00100000
00001000
01100000
*/
 
/* Должен быть такой
00100000
00001000
01100010 Вот тут не точно
*/
 
 
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
31.12.2014, 16:56
Лучший ответ Сообщение было отмечено lenston как решение

Решение

У меня выводит верно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
int main()
{
    char a[3];
 
a[0] = 0x80;
a[1] = 0x04;
a[2] = 0x31;
 
    for (int i = 0; i < 3; ++i){
        cout << std::bitset<8>(a[i]) << std::endl;
    }
    cout << endl;
 
 
char c = 0, nc;
 
for (int i = 0; i < 3; ++i){
    if ((a[i] & 0x80) != 0) nc = 1;
    else nc = 0;
    a[i] <<= 1;
    a[i] |= c;
    c = nc;
}
    for (int i = 0; i < 3; ++i){
        cout << std::bitset<8>(a[i]) << std::endl;
    }
 
    cout << endl;
    system("pause");
    return 0;
}
Ты в чём где программируешь? Двоичных констант в Си нет.
Миниатюры
Работа с битами. Сдвиг бит в массиве переменных. О как  
0
2 / 0 / 1
Регистрация: 12.11.2014
Сообщений: 33
31.12.2014, 17:09  [ТС]
В GCC + GEANY

у меня все получилось уже, спасибо большое..

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "GIF.h"
 
typedef unsigned char BYTE;             
void    _dv(int n){                                     // перевод байта в двоичку
    int i=7;char buffer[]="00000000";
    do {int x=n%2;n=n/2; char z;
            if( x<10 )  z='0'+x;
            else        z='A'-10+x;
        buffer[i]=z; i--;
    } while (n>0); printf("%s\n",buffer);
}
 
int main(){
    BYTE a[3];
    
    a[0] = 0b00100100;
    a[1] = 0b01000010;
    a[2] = 0b10000001;
    a[3] = 0;
    
    int SDVIG=4;
    BYTE MASK=0b11111111>>(8-SDVIG);
    
    for (int i = 0; i < 3; ++i){_dv(a[i]);}
    printf ("\n\n"); 
    
    BYTE A = a[0]&MASK; _dv(A);     
    
    for (int i = 0; i < 3; ++i){
        a[i] >>= SDVIG;                             
        a[i] = ((a[i+1]&MASK)<<(8-SDVIG))|a[i]; 
    }
    printf ("\n\n"); 
    for (int i = 0; i < 3; ++i){_dv(a[i]);}
}
Добавлено через 37 секунд
Цитата Сообщение от nmcf Посмотреть сообщение
Ты в чём где программируешь? Двоичных констант в Си нет.
GCC
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
31.12.2014, 17:13
Для чего BYTE? Чем char не устроил?
0
2 / 0 / 1
Регистрация: 12.11.2014
Сообщений: 33
31.12.2014, 17:25  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Для чего BYTE? Чем char не устроил?
так-то все равно.. но вот так вот захотелось..
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
31.12.2014, 18:21
Цитата Сообщение от nmcf Посмотреть сообщение
Двоичных констант в Си нет.
В Си нет, а в С++14 есть.
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
31.12.2014, 20:56
Цитата Сообщение от DrOffset Посмотреть сообщение
в С++14 есть
После регулярных вопросов про graphics.h я не подумал, что кто-то дошёл до такого.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.12.2014, 20:56
Помогаю со студенческими работами здесь

Какая лучше из этих двух видео карт одна с 128 битами а другая 256 бит
ASUS AMD Radeon RX 560 STRIX (128 БИТ) или PowerColor AMD Radeon RX 570 Red Dragon OC 256 битттттттттттттт..........КАКАЯ ЛУЧШЕ ,ЦЕНА...

работа с битами и условиями (как мне кажется задача несложная)
доброго времени суток. есть задача которую, как это нагло не звучит, нужно решить до утра. Как ни прискорбно я сам в Ассемблере почти не...

Сдвиг влево на один бит
void Bitstring::shl() { int carry=!!(str&amp;0x80000000); str&lt;&lt;=1; str|=carry; str&lt;&lt;=1; } ...

Циклический сдвиг на 11 бит ГОСТ
Уже облазил весь гугл так и не нашел ответа, помогите пожалуйста разобраться Почему в ГОСТе происходит циклический сдвиг на 11 бит? ...

Выполнить арифметический сдвиг C на 3 бит влево
Здравствуйте уважаемые! Очень нужна ваша помощь по заданию, завтра последний день сдачи а я не разбираюсь в ассемблере. Задание: ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru