Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/35: Рейтинг темы: голосов - 35, средняя оценка - 4.66
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269

Записать поверх биты из одного числа в другое

26.07.2021, 19:04. Показов 7128. Ответов 73
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Скопировать первые end - start + 1 битов из A и записать поверх в B, начиная с позиции start по позицию end. Разрешается использовать только побитовые операции

Примеры работы функции:
C#
1
2
Foo(A: 554216104, B: 15, i: 0, j: 31) = 15
Foo(A: -1, B: 0, i: 31, j: 31) = 2147483647
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.07.2021, 19:04
Ответы с готовыми решениями:

Как поменять биты из одного числа в другое на определённом отрезке, используя только битовые операции?
как поменять биты из одного числа в другое на определённом отрезке, используя только битовые операции скрин прикрепил ...

Очень большие числа: узнать, есть ли остаток от деления одного числа на другое
Требуется узнать, есть ли остаток от деления одного числа на другое. Оба числа много больше int64, ~1000 символов и больше. Я попытался...

Делимость одного числа на другое
Даны два натуральных числа n и m. Если одно из них делится на другое нацело, выведите 1, иначе выведите любое другое целое число. При...

73
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.07.2021, 14:50
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Lexeq Посмотреть сообщение
Скопировать первые end - start + 1 битов
Цитата Сообщение от SoBadDay Посмотреть сообщение
начиная с позиции start по позицию end



Цитата Сообщение от wizard41 Посмотреть сообщение
С чего он решил, что должно остаться 15?
SoBadDay, поясните пожалуйста откуда берутся примеры и их результаты.
Вы их сами решаете?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
29.07.2021, 14:52
Цитата Сообщение от Lexeq Посмотреть сообщение
В общем, да, где-то косяк
Слава тебе, мил человек! Хоть я уже не один в этом утверждении.
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
29.07.2021, 14:53
kolorotur, ну как я понял, из донора берутся первые и вставляются в реципиента на позиции от start до end.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
29.07.2021, 14:57
SoBadDay, я уж и не знаю как еще доступнее объяснить.

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static void Main( string[] args )
        {
            uint A = 554216104;
            uint B = 15;
            int start = 0;
            int end = 31;
            int lenght = end - start + 1;
            uint C;
            var result = GetBitFrame( A, start, lenght );
 
            Console.WriteLine( new string( '0', 32 - ( int ) GetMSB32( A ) + 1 ) + Convert.ToString( A, 2 ) + " A = " + A );
            Console.WriteLine( new string( ' ', 32 - ( int ) GetMSB32( result ) + 1 - start ) + Convert.ToString( result, 2 ) );
            Console.WriteLine( new string( '0', 32 - ( int ) GetMSB32( B ) + 1 ) + Convert.ToString( B, 2 ) + " B = " + B );
            C = result << start;
            B &= C;
            C |= B;
            Console.WriteLine( new string( '0', 32 - ( int ) GetMSB32( C ) + 1 ) + Convert.ToString( C, 2 ) + " C = " + C );
 
 
 
            Console.ReadKey();
        }

При Foo(A: 554216104, B: 15, start: 0, end: 31):

При Foo(655, 2728, 3, 8):
1
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
29.07.2021, 15:00  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
В общем, нужно либо определиться откуда что копировать, либо в каком порядке должны идти аргументы в методы.
Следую совету. Взять первые j - i + 1 биты из source и заменить ими биты от start по end позицию destination.

C#
1
int Foo(int destination, int source ,int start, int end) {}
0000_0000_0000_0000_0000_0010_1000_11112 = 65510
0000_0000_0000_0000_0000_1010_1010_10002 = 272810
0000_0000_0000_0000_0000_1010_0111_10002 = 268010

C#
1
2
3
4
Foo(2728, 655, 3, 8)= 2680
Foo(554216104, 15, 0, 31) = 15
Foo(-2147483648, 2147483647, 0, 30) = -1
Foo(2147481425, 5440, 18, 23) = 2130966353
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
29.07.2021, 15:04
Upd: забыл еще одну операцию вставить. Но не суть - для первого примера все справедливо. И почему должно быть 15?

Добавлено через 3 минуты
Цитата Сообщение от SoBadDay Посмотреть сообщение
биты от startпо end
вы и так взяли N бит из А, поэтому они и так вставятся в В, начиная со стартовой позиции до длины N. Поэтому "по end" здесь - это лишнее.
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
29.07.2021, 15:06  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
И почему должно быть 15?
Потому что если скопировать все биты из исходного числа и заменить ими биты другого числа, получится исходное
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.07.2021, 15:06
Лучший ответ Сообщение было отмечено SoBadDay как решение

Решение

Цитата Сообщение от Lexeq Посмотреть сообщение
ну как я понял, из донора берутся первые и вставляются в реципиента на позиции от start до end.
Действительно, не подумал о такой интерпретации.

Цитата Сообщение от SoBadDay Посмотреть сообщение
Взять первые j - i + 1 биты из source и заменить ими биты от startпо end позицию destination.
C#
1
2
3
4
5
6
7
8
9
10
int Foo(int A, int B, int start, int end)
{
    int width = end - start + 1;
    unchecked
    {
        int donorMask = (int)((1L << width) - 1);
        int targetMask = donorMask << start;
        return (A & ~targetMask) | (B & donorMask) << start;
    }
}
C#
1
2
3
4
Debug.Assert(Foo(2728, 655, 3, 8) == 2680);
Debug.Assert(Foo(554216104, 15, 0, 31) == 15);
Debug.Assert(Foo(-2147483648, 2147483647, 0, 30) == -1);
Debug.Assert(Foo(2147481425, 5440, 18, 23) == 2130966353);
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
29.07.2021, 15:07
Цитата Сообщение от SoBadDay Посмотреть сообщение
Потому что если скопировать все биты из исходного числа и заменить ими биты другого числа, получится исходное
Так исходное и есть 554216104
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
29.07.2021, 15:10  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Так исходное и есть 554216104
Исходное - 15

Добавлено через 56 секунд
kolorotur, unchecked обрежет значение при переполнении?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
29.07.2021, 15:14
SoBadDay, вы уж определитесь что считать исходным.
Тогда да:
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.07.2021, 15:14
Цитата Сообщение от SoBadDay Посмотреть сообщение
unchecked обрежет значение при переполнении?
Да, он только гарантирует что при переполнении не будет выброшено исключение, вне зависимости от параметров компилятора.
1
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
29.07.2021, 15:16  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
вы уж определитесь что считать исходным
Для ясности я заново написал условие задачи с конкретными именами, а также для ясности привел шаблон функции. Остальное - на вашей совести
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
29.07.2021, 15:19
Цитата Сообщение от SoBadDay Посмотреть сообщение
Остальное - на вашей совести
Ошибка ваша была в этом: Foo(655, 2728, 3, 8). Из-за этого весь сыр-бор второй день. Вы попутали местами 655 и 2728. При этом остальные два варианта работали правильно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.07.2021, 15:19

Из одного числа вычесть другое
Turbo Pascal 7.0 Начал изучать паскаль написал простенькую программу VAR a,b:Longint; BEGIN a:=9000000; b:=1000; ...

Преобразование одного числа в другое
Учитель дал задание написать программу на Python по заданию из ЕГЭ. У исполнителя Калькулятор две команды, которым присвоены номера: ...

MikroPascal for AVR - по "алиасам", биты одного байта(переменной) назначить на биты других байтов(портов, пинов)
В связи повальной кастрацией портов в Atmega328 (Arduino Uno) возникла необходимость каким-то образом присвоить биты одной переменной, к...

Копирование битов из одного числа в другое
Скопировать первые end - start + 1 битов из A и вставить в B, начиная с позиции start по позицию end. Разрешается использовать только...

Замена одного числа на другое в array
Есть переменная img img_path_1=&quot;imagies/Screenshot_1.png&quot; img=cv2.imread(img_path_1,0) Такую инфу содержит


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

Или воспользуйтесь поиском по форуму:
74
Ответ Создать тему
Новые блоги и статьи
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru