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

Побитовое смещение вправо с изюминкой - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.88
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
23.12.2011, 15:10     Побитовое смещение вправо с изюминкой #1
Задание:

Необходимо написать программу, которая бы осуществляла побитовое смещение вправо следующим образом:

0100 0010
>>
0010 0001
>>
1001 0000 ( Единица с правого края перешла на левый край )
Помогите, пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2011, 15:10     Побитовое смещение вправо с изюминкой
Посмотрите здесь:

C++ побитовое увеличение
Побитовое представление числа. C++
C++ Побитовое чтение
C++ Побитовое исключающее ИЛИ (XOR)
Побитовое вычитание C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
23.12.2011, 15:14     Побитовое смещение вправо с изюминкой #2
А если такое число 1000 1011
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
23.12.2011, 15:20     Побитовое смещение вправо с изюминкой #3
Будет зависеть от того, сколько бит выделено под переменную. Обычно это указывается в задании. Судя по "ТЗ" выделяется 8 бит. Тогда делаем так.
C++
1
2
3
4
5
6
7
int a = 1;//0000 0001
int mask = 0x80;//1000 0000
if(a & 1)
{
    a >>= 1;//0000 0000
    a |= mask;//1000 0000
}
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
23.12.2011, 15:26  [ТС]     Побитовое смещение вправо с изюминкой #4
Добавлено через 3 минуты
Цитата Сообщение от go Посмотреть сообщение
А если такое число 1000 1011
1000 1011
>>
1100 0101
>>
1110 0010

Был бы очень благодарен за помощь.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
23.12.2011, 15:29     Побитовое смещение вправо с изюминкой #5
Это называется циклический битовый сдвиг:
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
unsigned int rshr(unsigned int x, unsigned int n)
{
   return (x << (32 - (n))) | (x >> n);
}
 
int main() 
{
   printf("%x", rshr(0x80000001, 2));
   return 0;
}
co6ak
Кошковед
 Аватар для co6ak
403 / 496 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
23.12.2011, 15:32     Побитовое смещение вправо с изюминкой #6
смари какая красата!

Не по теме:

аааа я ржу


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
int main()
{
    std::string str1;
    std::string str2;
    std::cin >> str1;
    std::cin >> str2;
 
    std::cout << str2[3] << str1[0] << str1[1] << str1[2] << " " << str1[3] << str2[0] << str2[1] << str2[2];
    std::cin.get();
    std::cin.get();
 
    return 0;
 
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.12.2011, 15:37     Побитовое смещение вправо с изюминкой #7
Это обычный цилкический сдвиг безо всякого изюма.
C++
1
2
3
4
5
6
7
8
asm
{
 PUSH EAX
 MOV AL, a
 ROR AL, 1
 MOV a, AL
 POP EAX
}
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
23.12.2011, 15:40     Побитовое смещение вправо с изюминкой #8
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    short n = 0x80; // 1000 0000
    int a = 0x8B; // 1000 1011
 
    a >>= 1;
    a |= n; // 1100 0101
 
    a >>= 1;
    a |= n; // 1110 0010
 
    printf (" %d \n", a);  // 226
 
    system ("pause");
    return 0;
}
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
23.12.2011, 16:50  [ТС]     Побитовое смещение вправо с изюминкой #9
Цитата Сообщение от go Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    short n = 0x80; // 1000 0000
    int a = 0x8B; // 1000 1011
 
    a >>= 1;
    a |= n; // 1100 0101
 
    a >>= 1;
    a |= n; // 1110 0010
 
    printf (" %d \n", a);  // 226
 
    system ("pause");
    return 0;
}
А как сделать так что бы программа делала это (a |= n)
только когда младший разряд из 1 переходит в 0

т.е. как это синтаксически реализовать ?

#include <stdlib.h>

int main(void)
{
short n = 0x80; // 1000 0000
int a = 0x8B; // 1000 1011

a >>= 1;
If (самый младший разряд перешел из 1 >> 0, то самый старший разряд 0>>1 ( a|= n; )

Как к конкретному разряду обращаться ?
подскажите, пожалуйста =)
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
23.12.2011, 16:53     Побитовое смещение вправо с изюминкой #10
C
1
2
// flag = младший разряд числа n
int flag = n & 1;
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
23.12.2011, 17:51  [ТС]     Побитовое смещение вправо с изюминкой #11
Всем спасибо

Cвой код я родил.
Вот работающие наброски для будущего поколения.
Мож у кого комментарии будут.

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
#include <iostream>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
 
using namespace std;
 
    int main()
{
            int data;
            int times; 
            cout << "Enter the number , that will be shifted: "; 
            cin >> data;
            cout << "Enter how many times your number will be shifted: ";
            cin >> times;
            int a = 1;//0000 0001
            int mask = 0x80;//1000 0000
            int i;
 
        for(i = 0;i<times;i++)
        {
            
    
                if(data & 1)
                    {
                    data=data>>1;
                    data |= mask;//1000 0000
                    }
                    
        data=data>>1;
        printf("%d \n",(int)data);
    
        }
 
system ("PAUSE");
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2011, 20:55     Побитовое смещение вправо с изюминкой
Еще ссылки по теме:

Побитовое сравнение двух чисел C++
C++ Работа с пикселями, побитовое копирование
C++ Побитовое чтение/запись в файл

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.12.2011, 20:55     Побитовое смещение вправо с изюминкой #12
Ещё можно так:
C++
1
a=(a>>1)|(a<<(sizeof(a)*8-1));
Добавлено через 11 минут
C++
1
2
3
4
5
6
7
8
int CircleRightShift(int a, int n)
{
 return=(a>>(n%(sizeof(a)*8)))|(a<<(sizeof(a)*8-(n%(sizeof(a)*a)))));
}
int CircleLeftShift(int a, int n)
{
 return=(a<<(n%(sizeof(a)*8)))|(a>>(sizeof(a)*8-(n%(sizeof(a)*a)))));
}
Добавлено через 37 минут
На счёт функций не уверен.
Yandex
Объявления
23.12.2011, 20:55     Побитовое смещение вправо с изюминкой
Ответ Создать тему
Опции темы

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