Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/213: Рейтинг темы: голосов - 213, средняя оценка - 4.53
 Аватар для MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 96

битовая маска

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

Студворк — интернет-сервис помощи студентам
как использовать битовую маску? за пример можно взять выделение k-того разряда из n-разрядного числа (в пофиг какой системе исчесления).
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.09.2008, 15:44
Ответы с готовыми решениями:

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

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

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

28
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
23.09.2008, 17:08
Студворк — интернет-сервис помощи студентам
о, да!
Еще можно перевести в строку и посчитать ее длину
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
23.09.2008, 17:09
Цитата Сообщение от Vourhey Посмотреть сообщение
о, да!
Еще можно перевести в строку и посчитать ее длину
видимо, мы не совсем поняли, что мс дос хотел... хотя вроде разговор шел не про разряды...
0
 Аватар для MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 96
23.09.2008, 17:16  [ТС]
ну, можно много еще чего придумать.
мне нужно обрабатывать числа, вводимые с клавиатуры, с каждым разрядом работать отдельно.
0
 Аватар для TGrey[WoLf]
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
05.10.2008, 12:34
Ну а еще проще:
Под 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
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
05.10.2008, 12:41
TGrey[WoLf], все это хорошо и красиво,просто беда в том, что ему не бит нужен, а разряд в числе... мы поначалу ему тоже про булевую алгебру рассказывали
0
4y4z
12.02.2010, 13:20
Цитата Сообщение от 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;
 Аватар для Зоти Сергей
230 / 227 / 65
Регистрация: 18.12.2009
Сообщений: 316
12.02.2010, 16:05
Все правильно сделали. Просто под конец нужна маска. Ведь Вы хотите затереть 24-ый бит.
тогда
Value|=buff[0]|buff[1]<<8|buff[2]<<16;
Value&=0x7FFFFF;
7FFFFF это 23 бита установленые в 1 и 24-ый в 0
В данном случае легко использовать 16 ричное представление, для определения маски.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
12.02.2010, 17:19
MsDos, я правильно понимаю, что постановка задачи следующая: например есть число в десятичной записи 1234567. Нужно выделить в этой десятичной записи третий с конца десятичный разряд (т.е. 5). Так чтоли? Если так, что через битовые операции этого не сделать
0
3 / 3 / 2
Регистрация: 25.04.2014
Сообщений: 87
11.03.2015, 13:16
Помогите разобраться с битовой маской, есть вектор 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.03.2015, 13:16

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

Битовая переменная
#include &lt;avr/io.h&gt; #include &lt;avr/pgmspace.h&gt; #include &lt;avr/delay.h&gt; struct LEDValu { char portName :7; ...

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

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

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


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru