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

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

26.07.2021, 19:04. Показов 7099. Ответов 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
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,744
Записей в блоге: 3
28.07.2021, 10:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от SoBadDay Посмотреть сообщение
Поменялся порядок ввода аргументов
Так их можно было в теле метода поменять. Логично предположить, что аргументы функции следуют в нормальном порядке: (int A, int B, int Start, int End) чем (int B, int A, int Start, int End).
И по сути получилось так, что и задание написано неверно, и функция делает непонятно что. Скрестив одно с другим мы нарвались на такие вот исследования.

Добавлено через 1 минуту
Цитата Сообщение от SoBadDay Посмотреть сообщение
Попробовал закастить к int, однако словил System.OverflowException
Foo не возвращает ничего. Там внутри на консоль вывод идет. В моем варианте.
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
28.07.2021, 10:58  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Foo не возвращает ничего. Там внутри на консоль вывод идет. В моем варианте.
Да, я немного изменил функцию
C#
1
2
3
4
5
6
7
8
        private static long Foo(long destination, long source, int start, int end)
        {
            int width = end - start + 1;
            long mask = (uint.MaxValue << (start + width)) | ~(uint.MaxValue << start);
            destination &= uint.MaxValue >> (32 - width);
 
            return (source & mask) | (destination << start);
        }
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
28.07.2021, 20:33  [ТС]
wizard41,
В воздухе завис вопрос, как отрефакторить функцию на работу с int. Все оказалось не так просто
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,744
Записей в блоге: 3
28.07.2021, 20:40
Цитата Сообщение от SoBadDay Посмотреть сообщение
как отрефакторить функцию на работу с int
так я ж еще днем сегодня сделал...

Добавлено через 56 секунд
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static void Main( string[] args )
        {
            Foo( 0, -1, 31, 31 );           // 2147483647
            Foo( 655, 2728, 3, 8 );         // 2680
            Console.Read();
        }
 
 
        static void Foo( int A, int B, int start, int end )
        {
            int width = end - start + 1;
            int mask = ( int.MaxValue << ( start + width ) ) | ~( int.MaxValue << start );
            A &= int.MaxValue >> ( 32 - width );
 
            Console.WriteLine( ( B & mask ) | ( A << start ) );
        }
Только А и В местами поменять надо.
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
29.07.2021, 07:07  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
так я ж еще днем сегодня сделал...
Для Foo(A: -1, B: 0, i: 31, j: 31) = 2147483647 проходит. А для Foo(554216104, 15, 0, 31) = 15 нет
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,744
Записей в блоге: 3
29.07.2021, 10:24
Цитата Сообщение от SoBadDay Посмотреть сообщение
А для Foo(554216104, 15, 0, 31) = 15 нет
Ошибка в исходных данных. Функция делает то, что в ней заложено. Она не может избирательно работать для одних входных чисел и не работать для других. Не должно быть 15, это не верный ответ.
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
29.07.2021, 10:48  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Не должно быть 15, это не верный ответ.
Мы с Вами в этой теме уже разобрались, что неверных ответов нет. Есть только неверно заданные исходные данные.
C#
1
2
3
4
5
6
7
8
private static int Foo(int A, int B, int start, int end)
{
int width = end - start + 1;
int mask = (int.MaxValue « (start + width)) | ~(int.MaxValue « start);
A &= int.MaxValue » (32 - width);
 
return (B & mask) | (A « start);
}
Для теста Foo(554216104, 15, 0, 31) копирование от 0 до 31 бита должно сделать B == A. Ответ 15 верен.
C#
1
2
3
 var test1 = Foo(0, -1, 31, 31); // 2147483647
var test2 = Foo(655, 2728, 3, 8); // 2680
var test3 = Foo(15, 554216104, 0, 31); // 554216111
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,744
Записей в блоге: 3
29.07.2021, 11:12
Цитата Сообщение от SoBadDay Посмотреть сообщение
уже разобрались, что неверных ответов нет
Ну вот смотрите, если сейчас переделать функцию чтобы она возвращала Foo(554216104, 15, 0, 31) = 15, остальные два примера перестанут работать (т.е. будут возвращать не те значения, которые "нужны"). О чем это говорит?
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
29.07.2021, 11:13  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
О чем это говорит?
Что он работает не во всех случаях
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,744
Записей в блоге: 3
29.07.2021, 11:18
Цитата Сообщение от SoBadDay Посмотреть сообщение
Что он работает не во всех случаях
Попробуйте сейчас сами, прям по шагам, на бумажке провести побитовые операции, согласно функции. И посмотрите что получится при 15, 554216104
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.07.2021, 11:30
Цитата Сообщение от SoBadDay Посмотреть сообщение
он зарезервирован для обозначения знака числа (0 для положительных и единица для отрицательных)
Вы int путаете с double/float.
В целочисленных типах ничего не "зарезервировано".

Цитата Сообщение от SoBadDay Посмотреть сообщение
словил System.OverflowException
При манипуляции битами имеет смысл помещать код манипулирования в блок unchecked.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,744
Записей в блоге: 3
29.07.2021, 11:35
Цитата Сообщение от wizard41 Посмотреть сообщение
Не должно быть 15
при текущем функционале внутри функции, имелось в виду.

Добавлено через 5 минут
Цитата Сообщение от kolorotur Посмотреть сообщение
помещать код манипулирования в блок unchecked
kolorotur, да, но в данном случае это не решает проблему ТС, причем проблема, скорее всего, в самом вопросе.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.07.2021, 11:38
Цитата Сообщение от wizard41 Посмотреть сообщение
проблема, скорее всего, в самом вопросе.
Если аргументы метода не превышают диапазон int, то Overflow быть не должно, вне зависимости от используемого алгоритма.
Но смена знака вполне возможна — для чего и стоит использовать unchecked.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,744
Записей в блоге: 3
29.07.2021, 11:42
Цитата Сообщение от kolorotur Посмотреть сообщение
Overflow быть не должно
с Overflow ТС видимо разобрался сам. Этот вопрос он вчера задал, я не стал отвечать, в надежде что автор сам дойдет до причины. А вот про unchecked хорошая мысль.
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
29.07.2021, 11:48  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Попробуйте сейчас сами, прям по шагам, на бумажке провести побитовые операции, согласно функции

15 = 0000_0000_0000_0000_0000_0000_0000_1111
554216104 = 0010_0001_0000_1000_1010_1010_1010_1000

В результате копирования от 0 до 31 бита:

? = 0000_0000_0000_0000_0000_0000_0000_1111


Пройдем пошагово по функции

int.MaxValue = 0111_1111_1111_1111_1111_1111 _1111_1111

int.MaxValue << (start + width) = 0000_0000_0000_0000_0000_0000_0000_0000

~(int.MaxValue << start) = 1000_0000_0000_0000_0000_0000 _0000_0000

int mask = (int.MaxValue << (start + width)) | ~(int.MaxValue << start) = 0000_0000_0000_0000_0000_0000_0000_0000 | 1000_0000_0000_0000_0000_0000 _0000_0000 = 1000_0000_0000_0000_0000_0000_0000_0000

int.MaxValue >> (32 - width) = 0000_0000_0000_0000_0000_0000_0000_0000

A &= int.MaxValue >> (32 - width) = 0000_0000_0000_0000_0000_0000_0000_1111 & 0000_0000_0000_0000_0000_0000_0000_0000 = 0000_0000_0000_0000_0000_0000_0000_0000

(B & mask) = 0010_0001_0000_1000_1010_1010_1010_1000 & 1000_0000_0000_0000_0000_0000 _0000_0000 = 0000_0000_0000_0000_0000_0000_0000_0000

(A << start) = 0000_0000_0000_0000_0000_0000_0000_1111

(B & mask) | (A << start) = 0000_0000_0000_0000_0000_0000_0000_0000 | 0000_0000_0000_0000_0000_0000_0000_1111 = 0000_0000_0000_0000_0000_0000_0000_1111 = 15


По функции вроде все так, как надо. Но на практике ответ выходит другой
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,744
Записей в блоге: 3
29.07.2021, 12:06
Цитата Сообщение от SoBadDay Посмотреть сообщение
int.MaxValue
не верен.

Добавлено через 7 минут
Если здесь участвуют манипуляции со знаком, то
Цитата Сообщение от SoBadDay Посмотреть сообщение
Скопировать первые end - start + 1 битов из A и записать поверх в B, начиная с позиции start по позицию end
вообще не в тему.
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
29.07.2021, 12:24  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Вы int путаете с double/float.
В целочисленных типах ничего не "зарезервировано".
В таком случае я ошибался, и int.MaxValue = 1111_1111_1111_1111_1111_1111_1111_1111.

Прошелся вновь по функции однако результат не изменился. Маска не имеет единичных битов, тогда B & mask аналогично, a A << start не меняет значения, т.к. start = 0. Итого (B & mask) | (A << start) => 15
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,744
Записей в блоге: 3
29.07.2021, 12:37
Надо сделать перерыв...
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.07.2021, 12:37
Цитата Сообщение от SoBadDay Посмотреть сообщение
int.MaxValue = 1111_1111_1111_1111_1111_1111_1111_1111
Нет, int.MaxValue = 0111_1111_1111_1111_1111_1111_1111_11112.
1111_1111_1111_1111_1111_1111_1111_11112 = -110
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
29.07.2021, 12:42  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Нет, int.MaxValue = 0111_1111_1111_1111_1111_1111_1111_1111.
Цитата Сообщение от SoBadDay Посмотреть сообщение
int.MaxValue = 0111_1111_1111_1111_1111_1111 _1111_1111
В первом решении так и было написано. Тогда к чему это?
Цитата Сообщение от wizard41 Посмотреть сообщение
int.MaxValue
не верен.
Добавлено через 1 минуту
В таком случае вопрос остается прежним.
Цитата Сообщение от SoBadDay Посмотреть сообщение
Пройдем пошагово по функции
выполнен верно. На бумажке функция должна возвращать 15. На практике 554216111
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.07.2021, 12:42

Из одного числа вычесть другое
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) Такую инфу содержит


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru