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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
inga_almazik
1 / 1 / 0
Регистрация: 17.03.2010
Сообщений: 5
#1

Побитовые опреции в си.Как решить ??? - C++

19.03.2010, 01:46. Просмотров 1693. Ответов 16
Метки нет (Все метки)

Привет)))
Дано длинное целое неотрицательное число. Получить число, инвертируя его нечетные биты.Если можно код с коментариями...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт С++
8282 / 3501 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
19.03.2010, 02:13     Побитовые опреции в си.Как решить ??? #2
допустим тип числа int
C++
1
2
3
int chislo = 123456, i, rez, size = sizeof(chislo) * 8;
for(i = 0; i < size; i <<= 1)
    rez += !((chislo>>i) & 1)<<i;
Где-то так, не проверял
kazak
3032 / 2353 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
19.03.2010, 03:03     Побитовые опреции в си.Как решить ??? #3
for(i = 1; i < size; i += 2)
easybudda
Эксперт С++
9439 / 5462 / 925
Регистрация: 25.07.2009
Сообщений: 10,481
19.03.2010, 10:34     Побитовые опреции в си.Как решить ??? #4
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
#include <stdio.h>
#include <limits.h>
    
/* Дано длинное целое неотрицательное число. Получить число, инвертируя его нечетные биты. */
 
/* функция, печатающая число в двоичном виде (для наглядности) */
void binPrn(unsigned long val){
    int i;
    for ( i = CHAR_BIT * sizeof(long) - 1; i >= 0; --i )
        printf("%d", val >> i & 1);
}
 
int main(void){
    unsigned long num, mask;
    int i;
    
    while ( 1 ){
        printf("\nNumber:\t");
        if ( scanf("%lu", &num) != 1 || !num )
            break;
        printf("Befor:\t");
        binPrn(num);
        printf("\t(%lu)\n", num);
        for ( i = 1; i < CHAR_BIT * sizeof(long); i += 2 ){
            mask = num & 1 << i;
            if ( mask )
                num ^= mask;
            else
                num |= 1 << i;
        }
        printf("After:\t");
        binPrn(num);
        printf("\t(%lu)\n", num);
    }
    
    return 0;
}
KoFeMaH
38 / 25 / 1
Регистрация: 21.02.2009
Сообщений: 249
22.03.2010, 22:42     Побитовые опреции в си.Как решить ??? #5
M128K145, можеш разьяснить пожалуйста что выполняется на каждом шаге.
easybudda, спасибо конечно, но О_О
M128K145
Эксперт С++
8282 / 3501 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
22.03.2010, 23:16     Побитовые опреции в си.Как решить ??? #6
кст, а ведь я с решением обманул
Вот так правильно
C++
1
2
3
int chislo = 255, i, rez = 0, size = sizeof(chislo) * 8;
for(i = 0; i < size; ++i)
    rez += ((i & 1) ? (chislo>>i) & 1 : !((chislo>>i) & 1))<<i;
1. объявляем переменные
2. находим количество бит - size
3. проходим по битам нашего числа
4. если индекс бита четный, то копируем бит в соответствующий бит числа rez
5. если индекс бита нечетный, то копируем инвертированый бит в соответствующий бит числа rez
KoFeMaH
38 / 25 / 1
Регистрация: 21.02.2009
Сообщений: 249
23.03.2010, 10:19     Побитовые опреции в си.Как решить ??? #7
Цитата Сообщение от M128K145 Посмотреть сообщение
кст, а ведь я с решением обманул
Вот так правильно
C++
1
2
3
int chislo = 255, i, rez = 0, size = sizeof(chislo) * 8;
for(i = 0; i < size; ++i)
    rez += ((i & 1) ? (chislo>>i) & 1 : !((chislo>>i) & 1))<<i;
1. объявляем переменные
2. находим количество бит - size
3. проходим по битам нашего числа
4. если индекс бита четный, то копируем бит в соответствующий бит числа rez
5. если индекс бита нечетный, то копируем инвертированый бит в соответствующий бит числа rez
что знак вопроса выполняет здесь?
((i & 1) ? (chislo>>i)
а >> знак это что?
этот код с++? а на с как он будет?
скажи пожалуйста.а то недавно си начали еще много чего не понятно=(
M128K145
Эксперт С++
8282 / 3501 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
23.03.2010, 10:45     Побитовые опреции в си.Как решить ??? #8
Этот код одинаково успешно выполнится на С и С++

C++
1
2
3
4
5
6
7
8
9
10
11
объявляем переменные chislo и сразу инициализируем значением 255, i, 
    rez и инициализируем нулем, size и присваиваем ему количество байт
    в переменной chislo умноженных на 8(количество бит в байте) типа int;
в цикле от 0 до 31 проходим каждый бит нашего числа chislo
    прибавляем к rez значение 
        ((если i нечетное)
            то путем битового сдвига вправо(>>) получаем i-ый бит переменной chislo и
                сравниваем побитово с 1(в итоге получаем 1 или 0, подробнее потом) :
            иначе путем битового сдвига вправо получаем i-ый бит переменной chislo и
                сравниваем побитово с 1, инвертируем его с помощью отрицания(!)) 
        и сдвигаем полученное число(1 или 0) на i позицию влево(<<)
Таблица истинности для операции И(&)
Код
   &
00   0
01   0
10   0
11   1
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
23.03.2010, 11:08     Побитовые опреции в си.Как решить ??? #9
А чего ж так усложнять то
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
#include <cstdio>
 
typedef unsigned int WORD32;
 
// Вывод числа в двоичном виде
void printwb(WORD32 X)
{
    for (int n = (sizeof(WORD32)*8 - 1); n >= 0; n--)
    {
        printf("%x",((X>>n)&1));
        if(n%4 == 0)
        {
            printf(" ");
        }
    }
    printf("\n");
}
 
WORD32 const mask = 0x55555555; // Маска для инверсии нечетных битов
 
int main(void) 
{ 
    WORD32 x = 0x19bfc4;    // число
    printwb(x);         // печать числа 
    printwb(x^mask);    // печать числа с инвертированными битами
}
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
23.03.2010, 12:20     Побитовые опреции в си.Как решить ??? #10
C++
1
2
3
int chislo = 123456, i;
for(i = 1; i > 0 ; i <<= 2) //берем с первого бита и сдвигаем на два разряда влево, пока не получится 0(превышение размерности переменной)
chislo^=i; //побитное исключающее или для каждого значения i;
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
23.03.2010, 16:07     Побитовые опреции в си.Как решить ??? #11
2fasked: биты всегда нумеровались с 0-го, а не с 1-го !
Значит нужно инвертировать 1-ый, 3-ий, 5-ый, ....
Маска будет 0xAAAAAAAA

Добавлено через 2 минуты
2Patch: лучше взять unsigned chislo= 123456;
А то при инвертировании 31-го бита получим отрицательное число.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
23.03.2010, 18:11     Побитовые опреции в си.Как решить ??? #12
Цитата Сообщение от odip Посмотреть сообщение
2Patch: лучше взять unsigned chislo= 123456;
А то при инвертировании 31-го бита получим отрицательное число.
учтено. 31-ый бит четный, и мы на него никогда не попадем.
считаем-же с 0-его бита.
хотя, как надо нумеровать биты из контекста задачи не ясно...
0 - это четный, или нет?
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.03.2010, 09:45     Побитовые опреции в си.Как решить ??? #13
Цитата Сообщение от odip Посмотреть сообщение
2fasked: биты всегда нумеровались с 0-го, а не с 1-го !
Значит нужно инвертировать 1-ый, 3-ий, 5-ый, ....
Маска будет 0xAAAAAAAA
Да да да =) протупил )).. хотя это не суть задачи ))..
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
24.03.2010, 10:39     Побитовые опреции в си.Как решить ??? #14
учтено. 31-ый бит четный, и мы на него никогда не попадем.
считаем-же с 0-его бита.
0 - четный
31 - нечетный
Для операции с битами лучше всегда использовать unsigned, unsigned long - дабы не было приколов со знаками.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.03.2010, 10:43     Побитовые опреции в си.Как решить ??? #15
Да и по заданию число неотрицательное
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
24.03.2010, 11:15     Побитовые опреции в си.Как решить ??? #16
Цитата Сообщение от odip Посмотреть сообщение
0 - четный
31 - нечетный
Для операции с битами лучше всегда использовать unsigned, unsigned long - дабы не было приколов со знаками.
ну, если так - то согласен.

я понял так, как обычно говорят преподаватели:
что нужно инвертировать каждый ВТОРОЙ бит, начиная с первого.

по определению:
Четный — прил. 1. Такой, который без остатка делится на два; кратный двум (о числах).
бит 0 - сюда не относится.
значит, скорее всего, постановщик задачи нумеровал биты не с 0, а с 1.

...но что имел ввиду постановщик задачи - можно лишь догадываться.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2010, 11:18     Побитовые опреции в си.Как решить ???
Еще ссылки по теме:

C++ Побитовые операции на с++ (<< и >>)
C++ Побитовые операции
Побитовые операции C++
C++ Побитовые функции
Побитовые операции: как работает этот сдвиг вправо и логическое "И"(&) ? C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.03.2010, 11:18     Побитовые опреции в си.Как решить ??? #17
Цитата Сообщение от inga_almazik Посмотреть сообщение
Дано длинное целое неотрицательное число. Получить число, инвертируя его нечетные биты.Если можно код с коментариями...
Разобрать на байты, потом ксорить с 0x66 оператором a&=0x66, где a - байт в переменной типа char.
Yandex
Объявления
24.03.2010, 11:18     Побитовые опреции в си.Как решить ???
Ответ Создать тему
Опции темы

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