1 / 1 / 1
Регистрация: 03.04.2013
Сообщений: 43
|
||||||
1 | ||||||
Сделать в числе n циклическую перестановку четных бит на k бит вправо18.12.2015, 16:37. Показов 6044. Ответов 16
Метки нет (Все метки)
Написать программу, которая позволит ввести два числа n и k типа ulong с клавиатуры, напечатать их на дисплее, и используя битовые операции сделать в числе n циклическую перестановку четных бит на k бит вправо, вывести результат. Циклическая перестановка четных бит числа 0111 0101 0011 1101 на один бит вправо даст число 0111 0101 0110 1101.
Помогите пожалуйста.
0
|
18.12.2015, 16:37 | |
Ответы с готовыми решениями:
16
Циклический сдвиг в целом числе на n бит влево и вправо Выполнить циклическую перестановку элементов массива влево или вправо Поделить строку на блоки по 12 бит и заменить в каждом блоке случайный бит Самые часто встречающиеся 24 символа кодировать по 5 бит. А все остальные по 10 бит |
1 / 1 / 1
Регистрация: 03.04.2013
Сообщений: 43
|
||||||
20.12.2015, 11:27 [ТС] | 2 | |||||
Решил вот таким методом:
0
|
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
|
|
20.12.2015, 12:12 | 3 |
Мне чет непонятно, почему изменилось лишь полбайта?
Добавлено через 6 минут И, что, по вашему, четный байт? Выделите в числе четные байты жирным, и в конечном числе, места, где они будут стоять при циклическом сдвиге сдвиге вправо.
0
|
20.12.2015, 12:13 | 4 | |||||
1
|
1 / 1 / 1
Регистрация: 03.04.2013
Сообщений: 43
|
|
20.12.2015, 13:11 [ТС] | 5 |
Storm23, куда-то бит у тебя теряется.
Добавлено через 2 минуты Woldemar89, четные биты это биты стоящие под номерами 0 2 4 6 8 и т.д. начиная справа
0
|
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
|
|
20.12.2015, 13:14 | 6 |
Ну сдвинули вправо их на 1, - получится то не то, что ты показал.
Добавлено через 56 секунд Не по теме: для того, чтобы ник вставить, жмакни по нему мышкой.
0
|
1 / 1 / 1
Регистрация: 03.04.2013
Сообщений: 43
|
|
20.12.2015, 13:45 [ТС] | 7 |
Woldemar89, циклическая перестановка четных т.е. при сдвиге на 1 - 0 бит (первая 1 справа) станет 14 битом, а остальные четные сдвинуться вправо через один. Все нечетные останутся без изменений. 1001 1001 1001 1001 -> 1100 1100 1100 1100 (вот пример нагляднее)
0
|
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
|
||||||
20.12.2015, 13:54 | 8 | |||||
Вы привели в пример ushort (uint16) - а работа идет с ulong.
Так все норм будет, если взять 64 бита, а не 16.
0
|
1 / 1 / 1
Регистрация: 03.04.2013
Сообщений: 43
|
|
20.12.2015, 14:47 [ТС] | 9 |
Woldemar89, а если взять тип ushort то код будет работать с 16 битными?
0
|
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
|
|
20.12.2015, 15:51 | 10 |
На uint32 вроде без проблем можно переделать, посмотри как и с чем оператор сдвига работает.
https://msdn.microsoft.com/ru-... 8et0d.aspx На uint16 могут заморочки быть, хотя не уверен.
0
|
17790 / 12941 / 3381
Регистрация: 17.09.2011
Сообщений: 21,215
|
|
20.12.2015, 17:12 | 11 |
Не могу понять, как из первого числа получилось второе:
0111 0101 0011 1101 0111 0101 0110 1101
0
|
Woldemar89
|
20.12.2015, 17:16
#12
|
Не по теме: kolorotur, да я уже 2-3 раза спрашивал ТС :) Молчит, как партизан.
0
|
1 / 1 / 1
Регистрация: 03.04.2013
Сообщений: 43
|
|
21.12.2015, 16:06 [ТС] | 13 |
Woldemar89, я не из головы взял эти числа, те что были в задании что препод дал те и написал... как правильно объяснить не знаю...
выделяем четные биты 0111 0101 0011 1101 при циклической перестановки на 1 в право 0111 0101 0110 1101 нечетные биты при этом остаются на месте
0
|
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
|
|
21.12.2015, 16:30 | 14 |
А теперь давай-ка состыкуем:
Сдвиг на 1 означает не просто вправо, а именно по четным местам, через 1. (Как бэ 1, по сути,означает через 2). Ну и нумерация как вы написали, верно? Добавлено через 1 минуту Ну и для какого числа в итоге то надо? uint 16 32 64 ?
0
|
0 / 0 / 2
Регистрация: 21.12.2015
Сообщений: 10
|
|
21.12.2015, 16:40 | 15 |
Нумерация правильная это точно но вот со сдвигом надо поработать. Слишком сложно он у вас задействован. Можно проще сделать.
0
|
1 / 1 / 1
Регистрация: 03.04.2013
Сообщений: 43
|
|||||||||||
26.12.2015, 15:50 [ТС] | 16 | ||||||||||
Woldemar89,
Именно так.
Надо в итоге для 64, правда сам не понимаю почему пример в задаче показан на 16. Решил задачу так
По ходу решения возник еще один вопрос. Почему при попытке выделить какие либо биты у типа ushort выдает ошибку? Как это решить?
0
|
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
|
||||||
26.12.2015, 21:46 | 17 | |||||
Ошибку тебе VS написала, наверняка даже русским языком.
Не удается неявно преобразовать тип "int" в "ushort". Дело в том, что результат логических операций | & >> << итд выдается как int. Поэтому, всего лишь, нужно выполнить преобразование. Проблема не совсем очевидная, если не знать - но, додуматься можно было, тк VS указала на проблему.
0
|
26.12.2015, 21:46 | |
26.12.2015, 21:46 | |
Помогаю со студенческими работами здесь
17
При сложении по модулю два двух чисел по 48 бит пропадает 1 бит Подскажите какую аппаратную платформу с моим железом ставить? 64-бит или 86-бит ! В исходной строке а$ произвести циклическую перестановку слов вправо на n слов. Вывести исходную и полученную Преобразовать прямоугольную матрицу так, чтобы ее ряды расположились на увеличение их бит-в-бит сумм Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |