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

Написать функцию которая в заданом числе меняет местами два бита с задаными номерами - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.73
6blgJlo'KOgeP
0 / 0 / 0
Регистрация: 13.12.2011
Сообщений: 21
30.01.2012, 15:40     Написать функцию которая в заданом числе меняет местами два бита с задаными номерами #1
Сижу на экзамене очень сильно нужна помощь:

задание - написать функцию которая в заданом числе меняет местами два бита с задаными номерами

код СИ ПОМОГИТЕ!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2012, 15:40     Написать функцию которая в заданом числе меняет местами два бита с задаными номерами
Посмотрите здесь:

C++ Написать программу которая меняет местами элементы массива
Написать программу, которая меняет местами элементы массива C++
Написать функцию, которая меняет местами два числа, которые передаются в нее через параметры по указателю C++
C++ Двумерные массивы. Написать функцию, которая меняет значения диагональных элементов
C++ Написать программу, которая получает два трехзначных числа, меняет у них местами средние цифры и выводит результат в консоль
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
30.01.2012, 16:12     Написать функцию которая в заданом числе меняет местами два бита с задаными номерами #2
особо без проверок на ошибки функция, но для демонстрации вполне подойдет.
беззнаковое целое надо давать на вход

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
unsigned int quad(unsigned int num) // возведение 2-ки в степень num
{
    unsigned int val = 0;
    if(num==0) 
        {return 1;}
    return val = quad(--num)*2;
};
 
int changebit(unsigned int num, int bit1=0, int bit2 = 0) //функция меняющая в числе num 2 бита местами
{
    char buf [15];
    itoa(num,buf,2);//переводит число в двоичный вид
    int lent = strlen(buf);
    bit1 = lent-bit1;//находим позиции бит в массиве
    bit2 = lent-bit2;
 
        if(bit1<0||bit1>31||bit2<0||bit2>31)return num; //небольшая проверка на ошибки
 
    char tmp = buf[bit1];
    buf[bit1] = buf [bit2];
    buf[bit2]= tmp; //здесь меняются местами биты
 
    int val = 0;
    int step = lent-1;
 
    for(int i = 0; i<lent;i++,step--)
    {
 
        if(buf[i]!='0')
        {
            val+=quad(step); высчитываем число проходом по массиву
        }
    }
    
    return val;
};
 
int main(void)
{
    int z = changebit(13,2,3);
return 0;
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
30.01.2012, 16:22     Написать функцию которая в заданом числе меняет местами два бита с задаными номерами #3
Как-то так...
C
1
2
3
4
5
6
7
8
9
10
11
void swap_bits(int *num, int nbit1, int nbit2)
{
    int bit1 = (*num & (1 << nbit1)) >> nbit1;
    int bit2 = (*num & (1 << nbit2)) >> nbit2;
    
    *num &= ~(1 << nbit1);
    *num &= ~(1 << nbit2);
    
    *num |= bit1 << nbit2;
    *num |= bit2 << nbit1;
}
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
30.01.2012, 16:41     Написать функцию которая в заданом числе меняет местами два бита с задаными номерами #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
unsigned int quad(unsigned int num)
{
    unsigned int val = 0;
    if(num==0) 
        {return 1;}
    return val = quad(--num)*2;
};
 
int changebit(int num, int bit1=0, int bit2 = 0)
{
    char buf [15];
    itoa(num,buf,2);
 
    int lent = strlen(buf);
    bit1 = lent-1-bit1;//здесь жучок был. -1 надо еще отнимать было
    bit2 = lent-1-bit2;//теперь работает
 
        if(bit1<0||bit1>31||bit2<0||bit2>31)return num;
 
    char tmp = buf[bit1];
    buf[bit1] = buf [bit2];
    buf[bit2]= tmp; 
    int val = 0;
    int step = lent-1;
 
    for(int i = 0; i<lent;i++,step--)
    {
 
        if(buf[i]!='0')
        {
            val+=quad(step);
        }
 
    }
    
    return val;
};
nxnx
Формучанин
361 / 292 / 16
Регистрация: 02.11.2010
Сообщений: 1,226
30.01.2012, 16:41     Написать функцию которая в заданом числе меняет местами два бита с задаными номерами #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C
1
2
3
4
5
6
7
unsigned int change(unsigned int num,unsigned char t1,unsigned char t2)
{
   if ((num >> t1 ^ num >> t2) & 1)    
        num^=1 << t1 | 1 << t2;    
    return num;
    
}
silent_1991
30.01.2012, 16:55
  #6

Не по теме:

Да уж, биты я доставал шикарно За объектами уже битовые операции забыл...

Лев Борисов
2 / 2 / 0
Регистрация: 14.02.2013
Сообщений: 99
31.03.2013, 23:49     Написать функцию которая в заданом числе меняет местами два бита с задаными номерами #7
А можно объяснить, пожалуйста?

Добавлено через 38 минут
Т.е. что деает конкретно эта операция:
C
1
x^=1<<t1|1<<t2;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2013, 00:08     Написать функцию которая в заданом числе меняет местами два бита с задаными номерами
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
01.04.2013, 00:08     Написать функцию которая в заданом числе меняет местами два бита с задаными номерами #8
Лев Борисов, инвертирует два бита в переменной x с номерами t1 и t2
Вообще решение - просто гениальное
Yandex
Объявления
01.04.2013, 00:08     Написать функцию которая в заданом числе меняет местами два бита с задаными номерами
Ответ Создать тему
Опции темы

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