7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
1

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

23.12.2011, 15:10. Показов 3898. Ответов 11
Метки нет (Все метки)

Задание:

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

0100 0010
>>
0010 0001
>>
1001 0000 ( Единица с правого края перешла на левый край )
Помогите, пожалуйста.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2011, 15:10
Ответы с готовыми решениями:

Побитовое смещение
Здравствуйте, задача така стоит: Хочу сделать циклический побитовой сдвиг любого числа. Пример:...

Побитовое смещение. Программа работает, но мэйн возвращвет не 0
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<cstring> #include<conio.h> #define...

Смещение текста вправо
В этом примере смещение работает // modify adjustfield using manipulators #include <iostream> ...

Побитовое смещение vs арифметические операторы
Быстрее ли побитовое смещение за арифметические операторы и почему? Вот:

11
go
Эксперт С++
3645 / 1377 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
23.12.2011, 15:14 2
А если такое число 1000 1011
0
2554 / 1319 / 178
Регистрация: 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
}
1
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
23.12.2011, 15:26  [ТС] 4
Добавлено через 3 минуты
Цитата Сообщение от go Посмотреть сообщение
А если такое число 1000 1011
1000 1011
>>
1100 0101
>>
1110 0010

Был бы очень благодарен за помощь.
0
Эксперт С++
5032 / 2611 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 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;
}
2
Кошковед
520 / 508 / 63
Регистрация: 12.04.2010
Сообщений: 1,390
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;
 
}
1
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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
}
1
go
Эксперт С++
3645 / 1377 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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;
}
1
7 / 7 / 3
Регистрация: 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; )

Как к конкретному разряду обращаться ?
подскажите, пожалуйста =)
0
Эксперт С++
5032 / 2611 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
23.12.2011, 16:53 10
C
1
2
// flag = младший разряд числа n
int flag = n & 1;
1
7 / 7 / 3
Регистрация: 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");
}
0
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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 минут
На счёт функций не уверен.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2011, 20:55
Помогаю со студенческими работами здесь

Вопрос с изюминкой
Вообщем, есть сайт. Регистрировался как sait.ru. И в выдаче Яще также sait.ru. С недавних пор...

Одномерный массив с изюминкой
Задача: В произвольно заданном одномерном массиве целых чисел определить элементы, сумма цифр в...

Простые числа, но с ИЗЮМИНКОЙ
Составить программу, которая определяет И первых простых чисел. И - вводимое простое число. ...

Побитовое И
Добрый вечер всем,подскажите пожалуйста,на каком примере можно рассмотреть такой факт,что побитовое...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru