Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 233, средняя оценка - 4.85
MsDos
 Аватар для MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 91
23.09.2008, 15:44     битовая маска #1
как использовать битовую маску? за пример можно взять выделение k-того разряда из n-разрядного числа (в пофиг какой системе исчесления).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
23.09.2008, 17:08     битовая маска #21
о, да!
Еще можно перевести в строку и посчитать ее длину
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Lord_Voodoo
Супер-модератор
 Аватар для Lord_Voodoo
8505 / 2172 / 61
Регистрация: 07.03.2007
Сообщений: 10,844
Завершенные тесты: 1
23.09.2008, 17:09     битовая маска #22
Цитата Сообщение от Vourhey Посмотреть сообщение
о, да!
Еще можно перевести в строку и посчитать ее длину
видимо, мы не совсем поняли, что мс дос хотел... хотя вроде разговор шел не про разряды...
MsDos
 Аватар для MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 91
23.09.2008, 17:16  [ТС]     битовая маска #23
ну, можно много еще чего придумать.
мне нужно обрабатывать числа, вводимые с клавиатуры, с каждым разрядом работать отдельно.
TGrey[WoLf]
 Аватар для 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 системе.

Если что не так написал, не ругайте))) Я это понимаю именно так)
Lord_Voodoo
Супер-модератор
 Аватар для Lord_Voodoo
8505 / 2172 / 61
Регистрация: 07.03.2007
Сообщений: 10,844
Завершенные тесты: 1
05.10.2008, 12:41     битовая маска #25
TGrey[WoLf], все это хорошо и красиво,просто беда в том, что ему не бит нужен, а разряд в числе... мы поначалу ему тоже про булевую алгебру рассказывали
4y4z
Сообщений: n/a
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 ричное представление, для определения маски.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,354
Записей в блоге: 26
12.02.2010, 17:19     битовая маска #28
MsDos, я правильно понимаю, что постановка задачи следующая: например есть число в десятичной записи 1234567. Нужно выделить в этой десятичной записи третий с конца десятичный разряд (т.е. 5). Так чтоли? Если так, что через битовые операции этого не сделать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2015, 13:16     битовая маска
Еще ссылки по теме:

Битовая инверсия C++
Битовая маска C++
C++ "Битовая Маска"
C++ Битовая операция с отрицательным числом

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

Или воспользуйтесь поиском по форуму:
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
Yandex
Объявления
11.03.2015, 13:16     битовая маска
Ответ Создать тему
Опции темы

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