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

Циклический сдвиг. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
ХреновыйПрогер
0 / 0 / 0
Регистрация: 23.09.2010
Сообщений: 18
23.10.2010, 18:18     Циклический сдвиг. #1
Нужно написать вот такую прогу, где нужно сдвинуть число а на n бит влево.
Циклический сдвиг.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2010, 18:18     Циклический сдвиг.
Посмотрите здесь:

Циклический сдвиг массива C++
Циклический сдвиг C++
C++ циклический сдвиг
циклический сдвиг подскажите C++
C++ Циклический сдвиг массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
D@rkD@iver
110 / 110 / 3
Регистрация: 01.10.2008
Сообщений: 876
24.10.2010, 15:43     Циклический сдвиг. #2
ну а где сама задача то?
ну вот так сдвигается число a на n
a= a<<n;
ХреновыйПрогер
0 / 0 / 0
Регистрация: 23.09.2010
Сообщений: 18
24.10.2010, 15:46  [ТС]     Циклический сдвиг. #3
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
#include <stdio.h>
#include <conio.h>
 
void main(void)
 
{
typedef unsigned short int Integer; //16 bit.
    Integer a, b, x;
    a=1;
 
for( ; ; )
{
printf("\na=");
    scanf_s("%d", &a);
    printf("a= %d\t0x%X\n",a, a);
    
    printf("b=");
    scanf_s("%d", &b);
    
 
x = (a << b)|(a >>((sizeof(Integer)*8)-b)); 
 
printf("X= %d\t0x%X\n", x, x);
 
}
printf("The end");
}
Программу я написал, теперь не знаю как перевести a и х в двоичный код.
neosha
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 12
07.04.2012, 14:30     Циклический сдвиг. #4
для вывода числа в двоичном коде можно просто написать дополнительную функцию
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
07.04.2012, 14:38     Циклический сдвиг. #5
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
#define PRINT_BINARY(x) printf("\
%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d ", \
(x)&(1<<31),\
(x)&(1<<30),\
(x)&(1<<29),\
(x)&(1<<28),\
(x)&(1<<27),\
(x)&(1<<26),\
(x)&(1<<25),\
(x)&(1<<24),\
(x)&(1<<23),\
(x)&(1<<22),\
(x)&(1<<21),\
(x)&(1<<20),\
(x)&(1<<19),\
(x)&(1<<18),\
(x)&(1<<17),\
(x)&(1<<16),\
(x)&(1<<15),\
(x)&(1<<14),\
(x)&(1<<13),\
(x)&(1<<12),\
(x)&(1<<11),\
(x)&(1<<10),\
(x)&(1<<9),\
(x)&(1<<8),\
(x)&(1<<7),\
(x)&(1<<6),\
(x)&(1<<5),\
(x)&(1<<4),\
(x)&(1<<3),\
(x)&(1<<2),\
(x)&(1<<1),\
(x)&(1<<0)\
)
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
07.04.2012, 14:39     Циклический сдвиг. #6
Цитата Сообщение от neosha Посмотреть сообщение
для вывода числа в двоичном коде можно просто написать дополнительную функцию
можно cout <<bin <<a <<dec <<endl;
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
07.04.2012, 14:43     Циклический сдвиг. #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
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
#define PRINT_BINARY(x) printf("\
%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d ", \
(x)&(1<<31),\
(x)&(1<<30),\
(x)&(1<<29),\
(x)&(1<<28),\
(x)&(1<<27),\
(x)&(1<<26),\
(x)&(1<<25),\
(x)&(1<<24),\
(x)&(1<<23),\
(x)&(1<<22),\
(x)&(1<<21),\
(x)&(1<<20),\
(x)&(1<<19),\
(x)&(1<<18),\
(x)&(1<<17),\
(x)&(1<<16),\
(x)&(1<<15),\
(x)&(1<<14),\
(x)&(1<<13),\
(x)&(1<<12),\
(x)&(1<<11),\
(x)&(1<<10),\
(x)&(1<<9),\
(x)&(1<<8),\
(x)&(1<<7),\
(x)&(1<<6),\
(x)&(1<<5),\
(x)&(1<<4),\
(x)&(1<<3),\
(x)&(1<<2),\
(x)&(1<<1),\
(x)&(1<<0)\
);
Это бред какой -то))

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
#include <stdio.h>
#include <conio.h>
 
void int2bin(Integer x);
 
void main(void)
 
{
typedef unsigned short int Integer; //16 bit.
    Integer a, b, x;
    a=1;
 
for( ; ; )
{
printf("\na=");
    scanf_s("%d", &a);
    printf("a= %d\t0x%X\n",a, a);
    
    printf("b=");
    scanf_s("%d", &b);
    
 
x = (a << b)|(a >>((sizeof(Integer)*8)-b)); 
 
printf("X= %d\t0x%X\n", x, x);
int2bin(int x);
}
printf("The end");
}
 
void int2bin(Integer x)
{
    for(unsigned int n=1<<15; n>=1; n=n>>1)
        if(x&n)
            printf("1 ");
        else
            printf("0 ");
}
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.04.2012, 14:51     Циклический сдвиг. #8
Дату первого поста никто не смотрел?
можно cout <<bin <<a <<dec <<endl;
Нельзя

Добавлено через 36 секунд
Если, конечно, bin не переменная
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
07.04.2012, 15:13     Циклический сдвиг. #9
Цитата Сообщение от Merovingian Посмотреть сообщение
Это бред какой -то))

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
#include <stdio.h>
#include <conio.h>
 
void int2bin(Integer x);
 
void main(void)
 
{
typedef unsigned short int Integer; //16 bit.
    Integer a, b, x;
    a=1;
 
for( ; ; )
{
printf("\na=");
    scanf_s("%d", &a);
    printf("a= %d\t0x%X\n",a, a);
    
    printf("b=");
    scanf_s("%d", &b);
    
 
x = (a << b)|(a >>((sizeof(Integer)*8)-b)); 
 
printf("X= %d\t0x%X\n", x, x);
int2bin(int x);
}
printf("The end");
}
 
void int2bin(Integer x)
{
    for(unsigned int n=1<<15; n>=1; n=n>>1)
        if(x&n)
            printf("1 ");
        else
            printf("0 ");
}
Это бред какой-то
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
07.04.2012, 16:09     Циклический сдвиг. #10
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Это бред какой-то
Говорю, запись у вас очень элегантная.

Написать функцию для вывода двоичной записи числа - логично, а сделать тоже самое через директиву #define это как минимум странно))

Это, знаете, почти чтоже самое что и массив заполнять вот так:

C
1
2
3
4
5
...
array[0] = 0;
array[1] = 1;
array[2] = 2;
// и так еще 100500 раз
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
07.04.2012, 16:18     Циклический сдвиг. #11
Цитата Сообщение от Merovingian Посмотреть сообщение
array[0] = 0;
array[1] = 1;
array[2] = 2;
Запись такая нехороша не только и не столько своим индусским кодом, сколько неуниверсальностью.
Мы не сможем больше никак использовать код"array[1] = 1;"
Мой же принт вполне пригоден для употребления на практике.
-инт мало где изменит свой размер и станет 16 бит или тем более 33 бита, он почти всегда 32 бита
-В связи с этим мой код можно считать универсальным
-мой код не требует отладки, или требует значительно меньшей, чем проверять корректность функции с циклами и делениями, к тому же функция работает только до 16 бит.
-мой код значительно быстрее - на порядки, как в работе, так и в разработке. Не очень долго нажать 32 раза Shift+Ins.
- Мой код действительно быстрый, а если пугает его размер - спрячь его в хедер файл.
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
07.04.2012, 16:56     Циклический сдвиг. #12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Запись такая нехороша не только и не столько своим индусским кодом, сколько неуниверсальностью.
Мы не сможем больше никак использовать код"array[1] = 1;"
Мой же принт вполне пригоден для употребления на практике.
-инт мало где изменит свой размер и станет 16 бит или тем более 33 бита, он почти всегда 32 бита
-В связи с этим мой код можно считать универсальным
-мой код не требует отладки, или требует значительно меньшей, чем проверять корректность функции с циклами и делениями, к тому же функция работает только до 16 бит.
-мой код значительно быстрее - на порядки, как в работе, так и в разработке. Не очень долго нажать 32 раза Shift+Ins.
- Мой код действительно быстрый, а если пугает его размер - спрячь его в хедер файл.
Ну вы знаете, я имел ввиду "индусский" код)) Ну то, что ваш код выглядит странновато, то с этим тяжело спорить. Даже в умных книжках пишут функции, такие записи очень редко вижу.

int мало где изменит размер. Что значит почти всегда? есть случаи когда int не 32 бита?

По поводу того, что он быстро работает, не требует отладки и быстро написать его можно - согласен.

Дело в том, что написал я, что это бред ещ потому, что не работает ВАШ УНИВЕРСАЛЬНЫЙ КОД!

Добавлено через 8 минут
Нужно как то так делать

C
1
((x)&(1<<тут на сколько сдвигаем))?1:0
Тогда ваша конструкция заработает
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.04.2012, 17:01     Циклический сдвиг. #13
Цитата Сообщение от Merovingian Посмотреть сообщение
Нужно как то так делать
C
1
(x >> num) & 1
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
07.04.2012, 17:11     Циклический сдвиг. #14
Цитата Сообщение от soon Посмотреть сообщение
C
1
(x >> num) & 1
Ну все варианты работают, кроме варианта Kuzia domovenok.

Кстати он видимо перепутал.
C
1
(x)&&(1<<здесь на сколько сдвигаем)
Kuzia domovenok, вы, наверное, это хотели?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2012, 17:13     Циклический сдвиг.
Еще ссылки по теме:

Циклический сдвиг C++
C++ Циклический сдвиг
Циклический сдвиг в матрице C++

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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
07.04.2012, 17:13     Циклический сдвиг. #15
Цитата Сообщение от Merovingian Посмотреть сообщение
Кстати он видимо перепутал.
C
1
(x)&&(1<<здесь на сколько сдвигаем)
Kuzia domovenok, вы, наверное, это хотели?
Не! Ни в коем случае! только побитово!
Цитата Сообщение от soon Посмотреть сообщение
C
1
(x >> num) & 1
Спасибо, понял.
Yandex
Объявления
07.04.2012, 17:13     Циклический сдвиг.
Ответ Создать тему
Опции темы

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