Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/29: Рейтинг темы: голосов - 29, средняя оценка - 4.93
1 / 1 / 1
Регистрация: 03.04.2013
Сообщений: 43
1

Сделать в числе n циклическую перестановку четных бит на k бит вправо

18.12.2015, 16:37. Показов 6044. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Написать программу, которая позволит ввести два числа n и k типа ulong с клавиатуры, напечатать их на дисплее, и используя битовые операции сделать в числе n циклическую перестановку четных бит на k бит вправо, вывести результат. Циклическая перестановка четных бит числа 0111 0101 0011 1101 на один бит вправо даст число 0111 0101 0110 1101.
Помогите пожалуйста.
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
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Rabota2
{
    class Program
    {
        static void Main(string[] args)
        {
            ulong n, n1;
            int k;
            Console.WriteLine("Введите число n");
            n = ulong.Parse(Console.ReadLine());
            Console.WriteLine("Введите число k");
            k = int.Parse(Console.ReadLine());
            n1 = n & 0x5555555555555555;
            n = n & 0x2aaaaaaaaaaaaaaa;
            for(int i=0;i< k;i++)
            {
                n = n | n1;
            }
            
            Console.WriteLine(n);
            Console.ReadKey();
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.12.2015, 16:37
Ответы с готовыми решениями:

Циклический сдвиг в целом числе на n бит влево и вправо
Написать функцию циклического сдвига в 2𝑝 разрядном целом числе на 𝑛 бит влево и вправо.

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

Поделить строку на блоки по 12 бит и заменить в каждом блоке случайный бит
На входе есть строка типа string, каждый символ нужно перевести в последовательность битов, и эту...

Самые часто встречающиеся 24 символа кодировать по 5 бит. А все остальные по 10 бит
Требуется: самые часто встречающиеся 24 символа кодировать по 5 бит. А все остальные по 10 бит....

16
1 / 1 / 1
Регистрация: 03.04.2013
Сообщений: 43
20.12.2015, 11:27  [ТС] 2
Решил вот таким методом:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ulong n, n1, n2, n3;
            int k;
            Console.WriteLine("Введите число n");
            n = ulong.Parse(Console.ReadLine());
            Console.WriteLine("Введите число k");
            k = int.Parse(Console.ReadLine());
            n1 = n & 0x55555555;
            n2 = n & 0xAAAAAAAA;
            for (int i = 1; i <= k; i++)
            {
                n3 = n1 & 0x1;
                n3 = n3 << 14;
                n1 = n1 >> 2;
                n1 = n1 | n3;
            }
            n = n1 | n2;
            Console.WriteLine(n);
            Console.ReadKey();
Код рабочий, но препод хочет что бы это было выполнено без цикла... Уже всю голову сломал, ничего придумать не могу... Может кто знает как это сделать?
0
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
20.12.2015, 12:12 3
Цитата Сообщение от Diablo Mix Посмотреть сообщение
Циклическая перестановка четных бит числа 0111 0101 0011 1101 на один бит вправо даст число 0111 0101 0110 1101.
Мне чет непонятно, почему изменилось лишь полбайта?

Добавлено через 6 минут
И, что, по вашему, четный байт? Выделите в числе четные байты жирным, и в конечном числе,
места, где они будут стоять при циклическом сдвиге сдвиге вправо.
0
Эксперт .NETАвтор FAQ
10418 / 5148 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
20.12.2015, 12:13 4
Цитата Сообщение от Diablo Mix Посмотреть сообщение
используя битовые операции сделать в числе n циклическую перестановку четных бит на k бит вправо
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
using System;
 
namespace ConsoleApplication205
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var n = Convert.ToUInt64("0111010100111101", 2);
            var k = 1;
 
            var res = Shift(n, k);
 
            Console.WriteLine(Convert.ToString((int)res, 2));
            Console.ReadLine();
        }
 
 
        static ulong Shift(ulong n, int k)
        {
            var even = n & 0x5555555555555555UL;
            var odd = n & 0xAAAAAAAAAAAAAAAAUL;
            var left = even << 64 - k * 2;
            var right = even >> k * 2;
            return odd | left | right;
        }
    }
}
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
Цитата Сообщение от Diablo Mix Посмотреть сообщение
Циклическая перестановка четных бит числа 0111 0101 0011 1101 на один бит вправо даст число 0111 0101 0110 1101.
Ну сдвинули вправо их на 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
Цитата Сообщение от Diablo Mix Посмотреть сообщение
куда-то бит у тебя теряется.
Цитата Сообщение от Diablo Mix Посмотреть сообщение
1001 1001 1001 1001
Вы привели в пример ushort (uint16) - а работа идет с ulong.

Так все норм будет, если взять 64 бита, а не 16.
C#
1
2
3
4
5
6
7
            var n = Convert.ToUInt64("1001100110011001100110011001100110011001100110011001100110011001", 2);
            var k = 1;
 
            var res = Shift(n, k);
 
            Console.WriteLine(Convert.ToString((int)res, 2));
            Console.ReadLine();
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
Эксперт .NET
17790 / 12941 / 3381
Регистрация: 17.09.2011
Сообщений: 21,215
20.12.2015, 17:12 11
Цитата Сообщение от Diablo Mix Посмотреть сообщение
Циклическая перестановка четных бит числа 0111 0101 0011 1101 на один бит вправо даст число 0111 0101 0110 1101
Не могу понять, как из первого числа получилось второе:
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
Цитата Сообщение от Diablo Mix Посмотреть сообщение
четные биты это биты стоящие под номерами 0 2 4 6 8 и т.д. начиная справа
Цитата Сообщение от Diablo Mix Посмотреть сообщение
Циклическая перестановка четных бит числа 0111 0101 0011 1101 на один бит вправо даст число 0111 0101 0110 1101.
Цитата Сообщение от Diablo Mix Посмотреть сообщение
1001 1001 1001 1001 -> 1100 1100 1100 1100 (вот пример нагляднее)
А теперь давай-ка состыкуем:
Сдвиг на 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,
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Сдвиг на 1 означает не просто вправо, а именно по четным местам, через 1. (Как бэ 1, по сути,означает через 2).
Именно так.
Надо в итоге для 64, правда сам не понимаю почему пример в задаче показан на 16.

Решил задачу так
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
namespace Rabota2._1
{
    class Program
    {
        static void Main(string[] args)
        {
            ulong n, chet, nechet, n3;
            int k;
            Console.WriteLine("Введите число n");
            n = ulong.Parse(Console.ReadLine());
            Console.WriteLine("Введите число k");
            k = int.Parse(Console.ReadLine());
            chet = n & 0x5555555555555555;
            nechet = n & 0xAAAAAAAAAAAAAAAA;
 
            k = k % 64;
            n3 = chet << 64 - k * 2;
            n = (chet >> k * 2) | n3 | nechet;
 
            Console.WriteLine(n);
            
            Console.ReadKey();
        }
    }
}
Добавлено через 6 минут
По ходу решения возник еще один вопрос.
Почему при попытке выделить какие либо биты у типа ushort выдает ошибку?
Как это решить?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace Rabota2._1
{
    class Program
    {
        static void Main(string[] args)
        {
            ushort n, chet, nechet, n3;
            int k;
            Console.WriteLine("Введите число n");
            n = ushort.Parse(Console.ReadLine());
            Console.WriteLine("Введите число k");
            k = int.Parse(Console.ReadLine());
            chet = n & 0x5555;         //ошибка
}}}
0
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
26.12.2015, 21:46 17
Цитата Сообщение от Diablo Mix Посмотреть сообщение
ошибка
Ошибку тебе VS написала, наверняка даже русским языком.
Не удается неявно преобразовать тип "int" в "ushort".

Дело в том, что результат логических операций | & >> << итд выдается как int.

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

C#
1
chet = (ushort)(n & 0x5555);
0
26.12.2015, 21:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2015, 21:46
Помогаю со студенческими работами здесь

При сложении по модулю два двух чисел по 48 бит пропадает 1 бит
Здравствуйте, помогите пожалуйста. В этой строке пропадает 1 бит, т.е. должно быть 48, а их 47. R...

Подскажите какую аппаратную платформу с моим железом ставить? 64-бит или 86-бит !
Народ всем здравствуйте!!! Вчера обновил железо на своей машине! Проц. AMD Athlon II X4 631 для...

В исходной строке а$ произвести циклическую перестановку слов вправо на n слов. Вывести исходную и полученную
Помогите решить,пожалуйста: В исходной строке а$ произвести циклическую перестановку слов вправо на...

Преобразовать прямоугольную матрицу так, чтобы ее ряды расположились на увеличение их бит-в-бит сумм
Доброго времени суток! Прошу помочь с решением простых задач 2.Реформировать прямоугольную...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru