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

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

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

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

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

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

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

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

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

Побитовые операции - C++
Всем доброго утра. Дана такая задача: есть два чсила,поменять местами 2 последние цифры этих чисел между собой, т.е. 2 последних Х заменить...

Побитовые функции - C++
Написать функцию которая побитово сравнивает два числа и обчисляет общее количество положений на которых расположены одинаковые значения...

Побитовые операции - C++
Помогите, не могу понять как сделать эту программу( unsigned ChangeGroupBits(unsigned x, unsigned y, int n1, int n2); ChangeGroupBits–...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
M128K145
Эксперт С++
8286 / 3505 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
19.03.2010, 03:03 #3
for(i = 1; i < size; i += 2)
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
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
Эксперт С++
8286 / 3505 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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
Эксперт С++
8286 / 3505 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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
Эксперт С++
4934 / 2514 / 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
Эксперт С++
7157 / 3297 / 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
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.03.2010, 09:45 #13
Цитата Сообщение от odip Посмотреть сообщение
2fasked: биты всегда нумеровались с 0-го, а не с 1-го !
Значит нужно инвертировать 1-ый, 3-ий, 5-ый, ....
Маска будет 0xAAAAAAAA
Да да да =) протупил )).. хотя это не суть задачи ))..
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
24.03.2010, 10:39 #14
учтено. 31-ый бит четный, и мы на него никогда не попадем.
считаем-же с 0-его бита.
0 - четный
31 - нечетный
Для операции с битами лучше всегда использовать unsigned, unsigned long - дабы не было приколов со знаками.
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.03.2010, 10:43 #15
Да и по заданию число неотрицательное
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2010, 10:43
Привет! Вот еще темы с ответами:

Побитовые операции - C++
Задание: Дано целое неотрицательное число. Определить количество составляющих его шестнадцатеричных цифр, содержащих в двоичном...

Побитовые операции - C++
Задача: битовый образ 8*8 задается при помощи 8 байт, каждый байт состоит, соответственно, из 8 бит, бит={0,1}; при помощи побитовых...

Побитовые операции на с++ (<< и >>) - C++
Подскажите пожалуйста, такая задача - побитовый сдвиг на заданное количество символов сдвигает только цифры, как сделать чтобы он то же...

Побитовые операции в С++ - C++
Здраствуйте. Нужно написать программу которая будед считывать количество единичек (1) в побитовом представлении числа. Пример input: 15 ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.03.2010, 10:43
Ответ Создать тему
Опции темы

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