Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 233, средняя оценка - 4.85
MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 91
#1

битовая маска - C++

23.09.2008, 15:44. Просмотров 32372. Ответов 28
Метки нет (Все метки)

как использовать битовую маску? за пример можно взять выделение k-того разряда из n-разрядного числа (в пофиг какой системе исчесления).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2008, 15:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос битовая маска (C++):

Битовая маска - C++
Как в шифровании битовыми перестановками применить маску?

битовая маска - C++
надо разработать функцию проверки правильности битовой маски. 32-х битная “маска” считается действительной, если ее двоичное...

Как обратиться к объекту bitset так, чтобы результатом была битовая маска - C++
Здравствуйте, для образовательных целей решил научится работать с bitset, как я понял класс эмулирует массив с размером элемента 1 бит....

"Битовая Маска" - C++
Всем доброго времени суток, очень долго мучаюсь на битовыми операциями, а именно над так называемой маской. Гугл не выдал мне никаких...

Битовая инверсия - C++
Доброго времени суток! Я что-то запутался с побитовой инверсией. В коде прописываю int a=5; cout<<~a<<endl; Это же...

Битовая сортировка! - C++
Всем привет. Нужно написать реферат по теме "Битовая сортировка". Такого в инете, а также Википедиях и прочих джерелах даже примерно не...

28
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
23.09.2008, 16:55 #16
Ну тут, я думаю, та же байда, только нужно выяснить, какой бит будет заполнен для каждого разряда. Каждому разряду ячейки памяти соответствует всегда один и тот же разряд числа.
0
MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 91
23.09.2008, 17:01  [ТС] #17
меня и волнует единозначно ли будет соответствовать битовый коплекс разряду, что для меня уже ясно. но, кажется, проще выходит делить, чем расписывать маски.
0
Lord_Voodoo
Супер-модератор
8594 / 2211 / 61
Регистрация: 07.03.2007
Сообщений: 10,974
Завершенные тесты: 1
23.09.2008, 17:03 #18
я когда с периферийными устройствами работал по ком-порту, там куча флагов была, и приходилось вырезать по средствам побитовых операций, и никаких не удобств не было... и ты точно знаешь, какой бит анализируешь, но раз так надо делить, кто против, можно и делением это делать...
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
23.09.2008, 17:04 #19
Маски - быстрее работают просто. Делить, конечно, проще.
0
MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 91
23.09.2008, 17:05  [ТС] #20
черт, меня осенила вполне красивая идея без применения каких-либо манипуляций!

Добавлено через 1 минуту 30 секунд
дадада, потому у меня и была такая страсть свести все к ним. но теперь все проще: я просто буду считывать посимвольно и сразу обрабатывать результат
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
23.09.2008, 17:08 #21
о, да!
Еще можно перевести в строку и посчитать ее длину
0
Lord_Voodoo
Супер-модератор
8594 / 2211 / 61
Регистрация: 07.03.2007
Сообщений: 10,974
Завершенные тесты: 1
23.09.2008, 17:09 #22
Цитата Сообщение от Vourhey Посмотреть сообщение
о, да!
Еще можно перевести в строку и посчитать ее длину
видимо, мы не совсем поняли, что мс дос хотел... хотя вроде разговор шел не про разряды...
0
MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 91
23.09.2008, 17:16  [ТС] #23
ну, можно много еще чего придумать.
мне нужно обрабатывать числа, вводимые с клавиатуры, с каждым разрядом работать отдельно.
0
TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
05.10.2008, 12:34 #24
Ну а еще проще:
Под 1 байт отводится 8 бит максимальное число 11111111 = 286331153
Соответсвенно 2 байта 8*2 = 16(единиц максимальное число)
3 байта 8*3 = 24(единиц максимальное число)
4 байта 8*4 = 32(единиц максимальное число)
120 = 1111000(тут 7 бит из 8 ) поэтому недостающие биты пишем 0
120 = 01111000 но в идеале первой всегда идет 1.
10 = 1010(4 из 8 )
10 = 00001010
120 и 10 влазят в 1 байт поэтому недостающие биты ставим в 0.
Если бы это было число по больше использующее к примеру 2 байта(16 бит)
0000000111111111 тут 9 единиц значит уже больше 1 байта поэтому в 0 мы выставляем все остальное до 16 бит.
& - операция оставляет 1 там где бит = 1 в обоих числах.
01111000
&
00001010
---------
00001000
Тут и на глаз видно, что 1 только в одном месте остается. Получаем 1000 в 16 системе.

Если что не так написал, не ругайте))) Я это понимаю именно так)
0
Lord_Voodoo
Супер-модератор
8594 / 2211 / 61
Регистрация: 07.03.2007
Сообщений: 10,974
Завершенные тесты: 1
05.10.2008, 12:41 #25
TGrey[WoLf], все это хорошо и красиво,просто беда в том, что ему не бит нужен, а разряд в числе... мы поначалу ему тоже про булевую алгебру рассказывали
0
4y4z
12.02.2010, 13:20 #26
Цитата Сообщение от Vourhey Посмотреть сообщение
В смысле? Ну, ее можно использовать с булевыми операциями: например & или |. Любое число, по сути - битовая маска. Потом применяешь это число и булеву операцию на еще один операнд.
Ну например, чтобы взять 1-й бит числа, нужно применить к нему & и 10000000.
Вообщем, нужно просто знать двоичное представление числа и все. И булеву алгебру.
Не сочтите за некропостинг, но тема стала актуальна только сейчас.
Итак следующая проблема: есть char buff[24];
Согласно спецификации это строка вида AAABBBCCDDEFGHIJKLLLLMM.
ААА - 3-байтовое значение, где младшие 23 бита это целое неотрицательное число и т.д.

Как правильно выделить эти самые младшие биты из числа?
Корректен ли в данном случае такое вариант:
uint value = (buff[0]) | (buff[1] << 8) | (buff[2] << 16);
Или же нужно накладывать битовые маски на целочисленное представление этих самых трех байт?
ТО есть к примеру для E (целое неотрицательное число от 0 до 127) из этого же самого буфера получение младших 7 бит будет так:
E = E&01111111;
Зоти Сергей
228 / 226 / 13
Регистрация: 18.12.2009
Сообщений: 316
12.02.2010, 16:05 #27
Все правильно сделали. Просто под конец нужна маска. Ведь Вы хотите затереть 24-ый бит.
тогда
Value|=buff[0]|buff[1]<<8|buff[2]<<16;
Value&=0x7FFFFF;
7FFFFF это 23 бита установленые в 1 и 24-ый в 0
В данном случае легко использовать 16 ричное представление, для определения маски.
0
Evg
Эксперт CАвтор FAQ
18248 / 6373 / 438
Регистрация: 30.03.2009
Сообщений: 17,643
Записей в блоге: 28
12.02.2010, 17:19 #28
MsDos, я правильно понимаю, что постановка задачи следующая: например есть число в десятичной записи 1234567. Нужно выделить в этой десятичной записи третий с конца десятичный разряд (т.е. 5). Так чтоли? Если так, что через битовые операции этого не сделать
0
supdecar
3 / 3 / 2
Регистрация: 25.04.2014
Сообщений: 87
11.03.2015, 13:16 #29
Помогите разобраться с битовой маской, есть вектор F[10] равный в dec 137 hex 89 bin 10001001 Применяю сдвиг и маску
cout <<bitset<8>((F[10]>> 4)& 00000111);
Получаю: 00001000
Я не понимаю как так выходит, если я сдвинул на четыре вправо остается 00001000 применяем маску 00000111 должно было выйти 00000000 Что я не верно делаю??? скидываю свой код если нужен.
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <cstdlib>
#include <iostream>
#include <vector>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <string>
#include <bitset>
 
 
using namespace std;
 
int main()
{
//// Чтение из файла ///////////////////////////////////////////////////////////////////////////////
    vector<unsigned> F;
    unsigned FS;
    string s;
    int num;
    int colpar;
    int b;
    int q;
    size_t n;
    istringstream ss;
    ifstream ifs("D:\\1.txt"); 
 
    while (!ifs.eof())
    {
        getline(ifs, s);
        if ((n = s.find("68")) != string::npos)
        {
            if (s.length() - n >= 5)
            {
                if (!isxdigit(s[n + 2]) && s.substr(n + 3, 2) == "11")
                {
                    F.push_back(0x68);
                    F.push_back(0x11);
                    ss.str(s.substr(n + 5));
                    ss.clear();
                    while (!ss.eof())
                    {
                        ss >>hex>> FS;
                        ss.get();
                        F.push_back(FS);
                    }
                }
            }
        }
//// Вывод ///////////////////////////////////////////////////////////////////////////////////////////
        if (F.size() > 0)
        {
            for (int i = 0; i < F.size(); ++i)
            {
                num=i;
                cout <<setw(2)<<setfill('0') <<hex<<F[i] << " ";
                if ((i + 1) % 16 == 0) cout << endl;
            }
            cout <<"\n"<<endl;
            cout <<setfill(' ')<<"hex"<<fixed<<setw(10)<<"dec"<<fixed<<setw(20)<<"Comments";
            string a[num];
            
            if (F[0]=68){
            a[0] = "Start Byte";
            } else {a[0] = "Bad Packet";}
            
            if (F[1]=11){
            a[1] = "Tel Type";
            } else {a[1] = "Bad Packet";}
            
            a[2] = "SegNum";
            a[3] = "SegNum";
            a[4] = "Reserved";
            a[5] = "Reserved";
            a[6] = "Length";
            a[7] = "Length";
            a[8] = "Length";
            a[9] = "Length";
        
            if ((((F[10] >> 3) & 00000111) == 1)&&(((F[10] >> 4) & 00000111) == 0)&&(((F[10] >> 5) & 00000111) == 0)){
            a[10] = "1 pair Address";
            q = 2;}else if ((((F[10] >> 3) & 00000111) == 0)&&(((F[10] >> 4) & 00000111) == 1)&&(((F[10] >> 5) & 00000111) == 0)){
            a[10] = "2 pair Address";
            q = 4;}else if ((((F[10] >> 3) & 00000111) == 1)&&(((F[10] >> 4) & 00000111) == 1)&&(((F[10] >> 5) & 00000111) == 0)){
            a[10] = "3 pair Address";
            q = 6;}else if ((((F[10] >> 3) & 00000111) == 0)&&(((F[10] >> 4) & 00000111) == 0)&&(((F[10] >> 5) & 00000111) == 1)){
            a[10] = "4 pair Address";
            q = 8;}else if ((((F[10] >> 3) & 00000111) == 1)&&(((F[10] >> 4) & 00000111) == 0)&&(((F[10] >> 5) & 00000111) == 1)){
            a[10] = "5 pair Address";
            q = 10;}else if ((((F[10] >> 3) & 00000111) == 0)&&(((F[10] >> 4) & 00000111) == 1)&&(((F[10] >> 5) & 00000111) == 1)){
            a[10] = "6 pair Address";
            q = 12;}else if ((((F[10] >> 3) & 00000111) == 1)&&(((F[10] >> 4) & 00000111) == 1)&&(((F[10] >> 5) & 00000111) == 1)){
            a[10] = "7 pair Address";
            q = 14;}else {a[10] = "Bad Value";}
            
            for (int i=0;i<11;i++){
            cout<<"\n"<<hex<<F[i]<<dec<<setw(11)<<F[i]<<fixed<<setw(22)<<bitset<8>(F[i])<<fixed<<setw(35)<<a[i];
            }
cout <<bitset<8>((F[10]>> 4)& 00000111);
 
            F.clear();
            cout << endl << endl;
        }
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}
Добавлено через 1 час 0 минут
Исправил косяк был в использовании двоичного кода надо было вместо 00000111 писать 7
0
11.03.2015, 13:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2015, 13:16
Привет! Вот еще темы с ответами:

64-битовая строка - C++
Необходимо реализовать структуру 64-битовой строки состоящей из двух unsigned long полей, с последующей возможностью использования битовых...

С, битовая запись - C++
Всем доброго времени суток, после 3 дней поиска информации решил попытать счастье, задав вопрос у форумчан. так же читал много подобных...

Битовая операция -> - C++
Что делает операция -&gt; К примеру, есть структура: struct BIT{ unsigned int cod1:3; :1;...

Битовая арифметика - C++
Почему при: int myVar = 15, mask = 0x00 00 00 01; //выделил разряды printf(&quot;%d&quot;, myVar &amp; mask); Я получаю -1? Конечно, я мог бы...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru