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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.76
junior c
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 13
28.04.2013, 13:50     битовая маска #1
надо разработать функцию проверки правильности битовой маски.

32-х битная “маска” считается действительной, если ее двоичное представление содержит непрерывный ряд “1″ и следующий за ним ряд “0″.
Пример правильных битовых масок:
11110000000000000000000000000000
11111000000000000000000000000000
11111111111100000000000000000000

Пример неправильных битовых масок:
10110000000000000000000000001000
01111100000000000000001000000001

вот мой код,.. но здесь что-то не так
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
#include <iostream>
#include <stdlib.h>
#define N 32
using namespace std;
void test (long* mas){
     for (int i=0; i<N; i++){
         if (mas[i]<0 || mas[i]>1){
            cout <<"error"<<endl;
               break;
         }
         if(mas[i]<=mas[i+1]){
             cout<<"неправильно"<<endl;
             break;
            
         }
         else{
            cout<<"Правильно"<<endl;
            break;
         }
         
     }    
}
int main(){
    long mas[N];
    for(int i=0; i<N; i++)
         cin>>mas[i];
     
     test(mas);
 
system("PAUSE");   
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2013, 13:50     битовая маска
Посмотрите здесь:

C++ битовая маска
Битовая операция -> C++
Битовая сортировка! C++
64-битовая строка C++
C++ Битовая арифметика
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
28.04.2013, 14:09     битовая маска #2
В массиве у Вас 32 элемента,каждый из которых должно иметь значение 1 или 0, правильно? То есть, Ваш массив-это и есть битовая маска?
C++
1
2
3
4
5
if(mas[i]<=mas[i+1]){
             cout<<"неправильно"<<endl;
             break;
            
         }
Если первый элемент равен 1, а второй тоже 1, то это неправильно?
junior c
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 13
28.04.2013, 14:12  [ТС]     битовая маска #3
Цитата Сообщение от metaluga145 Посмотреть сообщение
В массиве у Вас 32 элемента,каждый из которых должно иметь значение 1 или 0, правильно? То есть, Ваш массив-это и есть битовая маска?
C++
1
2
3
4
5
if(mas[i]<=mas[i+1]){
             cout<<"неправильно"<<endl;
             break;
            
         }
Если первый элемент равен 1, а второй тоже 1, то это неправильно?
да, массив и есть битовой маской.
Неправильно будет когда после 0 будет 1
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
28.04.2013, 14:15     битовая маска #4
Кроме всего прочего, при таком цикле if, Вы вылезете за пределы массива(на последней итерации i=N-1, а что такое элемент N не ясно).

Добавлено через 1 минуту
Цитата Сообщение от junior c Посмотреть сообщение
Неправильно будет когда после 0 будет 1
тогда не
C++
1
mas[i]<=mas[i+1]
а
C++
1
mas[i]<mas[i+1]
Добавлено через 1 минуту
Да и не кажется ли Вам, что использовать long в данном случае не экономно с точки зрения памяти?
junior c
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 13
28.04.2013, 14:22  [ТС]     битовая маска #5
Цитата Сообщение от metaluga145 Посмотреть сообщение
Кроме всего прочего, при таком цикле if, Вы вылезете за пределы массива(на последней итерации i=N-1, а что такое элемент N не ясно).

Добавлено через 1 минуту

тогда не
C++
1
mas[i]<=mas[i+1]
а
C++
1
mas[i]<mas[i+1]
Добавлено через 1 минуту
Да и не кажется ли Вам, что использовать long в данном случае не экономно с точки зрения памяти?
по условию должен быть long,.. а с циклом не понял,.. там должно быть другое условие???
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
28.04.2013, 14:32     битовая маска #6
C++
1
2
3
4
if (i !=N-1)
    if(mas[i]<=mas[i+1]){
        cout<<"неправильно"<<endl;
        break;
Isantel
13 / 13 / 1
Регистрация: 23.11.2010
Сообщений: 254
28.04.2013, 14:33     битовая маска #7
Цитата Сообщение от junior c Посмотреть сообщение
по условию должен быть long,.. а с циклом не понял,.. там должно быть другое условие???
не "меньше или равно", а просто "меньше"
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
28.04.2013, 15:42     битовая маска #8
Можно было проще написать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    const int n = 32;
    bool mask[n] = {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    bool flag;
    for(int i = 0; i<n; i++){
        if( mask[i] == 0 && mask[i+1] == 1 ){
            flag = false;
            break;
        }
        flag = true;
    }
 
    if( flag ){ 
        printf("true\n");
    } else { printf("false\n"); };
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
28.04.2013, 15:47     битовая маска #9
UnsKneD,
Цитата Сообщение от UnsKneD Посмотреть сообщение
for(int i = 0; i<n; i++){
* * * * if( mask[i] == 0 && mask[i+1] == 1 ){
* * * * * * flag = false;
* * * * * * break;
* * * * }
* * * * flag = true;
* * }
И чему же равен mask[n]? 1 или 0? или 135456?(я про последнюю итерацию цикла)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2013, 15:55     битовая маска
Еще ссылки по теме:

C++ Как обратиться к объекту bitset так, чтобы результатом была битовая маска
С, битовая запись C++

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

Или воспользуйтесь поиском по форуму:
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
28.04.2013, 15:55     битовая маска #10
metaluga145, нда, не учел такого варианта что там в мусоре может оказаться.
тогда условие цикла будет выглядеть так
C++
1
for(int i = 0; i<n-1; i++)
Yandex
Объявления
28.04.2013, 15:55     битовая маска
Ответ Создать тему
Опции темы

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