Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
inga_almazik
1 / 1 / 0
Регистрация: 17.03.2010
Сообщений: 5
#1

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

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

Привет)))
Дано длинное целое неотрицательное число. Получить число, инвертируя его нечетные биты.Если можно код с коментариями...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2010, 01:46
Ответы с готовыми решениями:

Как работают побитовые сдвиги?
Люди объясните плиз как работают побитовые сдвиги << и >>, а то что то совсем...

Побитовые операции (программа, которая интерпретирует старшие 3 бита как некоторое число n...)
Уважаемые форумчане, нужна ваша помощь. Нужно составить программу, которая...

Побитовые операции: как работает этот сдвиг вправо и логическое "И"(&) ?
в этой функции перевожу в двоичную с/с но не могу понять как работает этот...

Побитовые операции в С++
Здраствуйте. Нужно написать программу которая будед считывать количество...

Побитовые операции
Задача должна быть реализована в с++ но пришлось временно писать в дельфи. ...

16
M128K145
Эксперт JavaЭксперт С++
8324 / 3544 / 420
Регистрация: 03.07.2009
Сообщений: 10,708
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;
Где-то так, не проверял
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
19.03.2010, 03:03 #3
for(i = 1; i < size; i += 2)
0
easybudda
Модератор
Эксперт CЭксперт С++
10054 / 5974 / 1493
Регистрация: 25.07.2009
Сообщений: 11,313
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;
}
0
KoFeMaH
38 / 25 / 4
Регистрация: 21.02.2009
Сообщений: 249
22.03.2010, 22:42 #5
M128K145, можеш разьяснить пожалуйста что выполняется на каждом шаге.
easybudda, спасибо конечно, но О_О
0
M128K145
Эксперт JavaЭксперт С++
8324 / 3544 / 420
Регистрация: 03.07.2009
Сообщений: 10,708
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
1
KoFeMaH
38 / 25 / 4
Регистрация: 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)
а >> знак это что?
этот код с++? а на с как он будет?
скажи пожалуйста.а то недавно си начали еще много чего не понятно=(
0
M128K145
Эксперт JavaЭксперт С++
8324 / 3544 / 420
Регистрация: 03.07.2009
Сообщений: 10,708
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
1
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 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);    // печать числа с инвертированными битами
}
1
Patch
2336 / 492 / 22
Регистрация: 01.04.2009
Сообщений: 2,181
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;
0
odip
Эксперт С++
7161 / 3220 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
23.03.2010, 16:07 #11
2fasked: биты всегда нумеровались с 0-го, а не с 1-го !
Значит нужно инвертировать 1-ый, 3-ий, 5-ый, ....
Маска будет 0xAAAAAAAA

Добавлено через 2 минуты
2Patch: лучше взять unsigned chislo= 123456;
А то при инвертировании 31-го бита получим отрицательное число.
0
Patch
2336 / 492 / 22
Регистрация: 01.04.2009
Сообщений: 2,181
23.03.2010, 18:11 #12
Цитата Сообщение от odip Посмотреть сообщение
2Patch: лучше взять unsigned chislo= 123456;
А то при инвертировании 31-го бита получим отрицательное число.
учтено. 31-ый бит четный, и мы на него никогда не попадем.
считаем-же с 0-его бита.
хотя, как надо нумеровать биты из контекста задачи не ясно...
0 - это четный, или нет?
0
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.03.2010, 09:45 #13
Цитата Сообщение от odip Посмотреть сообщение
2fasked: биты всегда нумеровались с 0-го, а не с 1-го !
Значит нужно инвертировать 1-ый, 3-ий, 5-ый, ....
Маска будет 0xAAAAAAAA
Да да да =) протупил )).. хотя это не суть задачи ))..
0
odip
Эксперт С++
7161 / 3220 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
24.03.2010, 10:39 #14
учтено. 31-ый бит четный, и мы на него никогда не попадем.
считаем-же с 0-его бита.
0 - четный
31 - нечетный
Для операции с битами лучше всегда использовать unsigned, unsigned long - дабы не было приколов со знаками.
0
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.03.2010, 10:43 #15
Да и по заданию число неотрицательное
0
Patch
2336 / 492 / 22
Регистрация: 01.04.2009
Сообщений: 2,181
24.03.2010, 11:15 #16
Цитата Сообщение от odip Посмотреть сообщение
0 - четный
31 - нечетный
Для операции с битами лучше всегда использовать unsigned, unsigned long - дабы не было приколов со знаками.
ну, если так - то согласен.

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

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

...но что имел ввиду постановщик задачи - можно лишь догадываться.
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
24.03.2010, 11:18 #17
Цитата Сообщение от inga_almazik Посмотреть сообщение
Дано длинное целое неотрицательное число. Получить число, инвертируя его нечетные биты.Если можно код с коментариями...
Разобрать на байты, потом ксорить с 0x66 оператором a&=0x66, где a - байт в переменной типа char.
0
24.03.2010, 11:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2010, 11:18

Побитовые операции
От друга услышал идею о побитовой сортировки имен (например). К примеру, если у...

побитовые операторы _
не могу разобраться в этой теме_ Вопрос по ходу дела, программа принимает число...

Побитовые операции в с++
здравствуйте! не могу понять, почему когда я применяю к числу a=0b01111101 (в...


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

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

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