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

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

26.07.2021, 19:04. Показов 6986. Ответов 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
3451 / 2772 / 575
Регистрация: 04.09.2018
Сообщений: 8,717
Записей в блоге: 3
29.07.2021, 12:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kolorotur Посмотреть сообщение
Нет, int.MaxValue = 0111_1111_1111_1111_1111_1111_1111_11112
Стоп стоп, я не к тому вел.

Добавлено через 2 минуты
SoBadDay, я на протяжении всей дискуссии пытаюсь навести вас на мысль, что где-то в начальных условиях закралась ошибка. Получается, что мы сейчас действуем не по правилам, описанным в задании, а просто пытаемся привести Foo к тем результатам, которые считаются "правильными".
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
29.07.2021, 12:46  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
1111_1111_1111_1111_1111_1111_1111_11112 = -110
Мне казалось, что -1 = 1000_0000_0000_0000_0000_0000_0000_0000
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.07.2021, 12:50
Цитата Сообщение от SoBadDay Посмотреть сообщение
Тогда к чему это?
Не знаю, это не я писал.

Цитата Сообщение от SoBadDay Посмотреть сообщение
Мне казалось, что -1 = 1000_0000_0000_0000_0000_0000_0000_0000
В прямом коде — да.
В шарпе целочисленные типы представлены в обратном коде, в котором -x = ~x + 1.
В обратном коде по значению старшего бита можно определить знак числа, но это просто закономерность, следующая из кодирования — точно так же, как по значению младшего бита можно определить четность, но это не значит, что младший бит зарезервирован для указания четности.
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
29.07.2021, 12:56
kolorotur, занудства ради, не в обратном а в дополнительном.
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.07.2021, 12:58
Цитата Сообщение от Lexeq Посмотреть сообщение
не в обратном а в дополнительном
Тьфу, конечно в дополнительном.
Спасибо за поправку!
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
29.07.2021, 12:59  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
где-то в начальных условиях закралась ошибка
Допустим такой вариант. Вряд ли с start или end может быть ошибка. В таком случае, можем изменить порядок ввода аргументов.

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(15, 554216104, 0, 31) = 554216111, хотя, судя по решению на листочке, должно быть 15
Foo(554216104, 15, 0, 31) = 554216111
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3451 / 2772 / 575
Регистрация: 04.09.2018
Сообщений: 8,717
Записей в блоге: 3
29.07.2021, 13:10
Цитата Сообщение от SoBadDay Посмотреть сообщение
Вряд ли с start или end может быть ошибка
Нет, ошибка не в этом, а в вопросе сабжа и/или в том, что делает ваша "эталонная" Foo.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.07.2021, 13:37
SoBadDay, так как задача-то поставлена в итоге?
Нужно end-start+1 битов, начиная со start, скопировать из А в В?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3451 / 2772 / 575
Регистрация: 04.09.2018
Сообщений: 8,717
Записей в блоге: 3
29.07.2021, 13:40
kolorotur, перезаписать в В.

Добавлено через 47 секунд
Но тут возникает неоднозначность, между текстом задания и эталонным результатом.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.07.2021, 13:48
Цитата Сообщение от wizard41 Посмотреть сообщение
Но тут возникает неоднозначность, между текстом задания и эталонным результатом.
Если примеры в первом сообщении верны, то похоже надо биты копироваь из В в А, а не наоборот.

Добавлено через 6 минут
Вот, чтобы решение соответствовало эталонным примерам из первого сообщения.
Биты из Б копируются в А.
C#
1
2
3
4
5
6
7
8
9
int Foo(int A, int B, int start, int end)
{
    int width = end - start + 1;
    unchecked
    {
        int mask = (int)((1L << width) - 1) << start;
        return (A & ~mask) | (B & mask);
    }
}
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3451 / 2772 / 575
Регистрация: 04.09.2018
Сообщений: 8,717
Записей в блоге: 3
29.07.2021, 13:49
Цитата Сообщение от kolorotur Посмотреть сообщение
копироваь из В в А, а не наоборот
к этому мы пришли еще вчера. Однако, не все примеры срабатывают.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.07.2021, 13:50
Цитата Сообщение от wizard41 Посмотреть сообщение
к этому мы пришли еще вчера
Читал тему по диагонали, видать пропустил.

Ну код выше при такой постановке должен работать.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3451 / 2772 / 575
Регистрация: 04.09.2018
Сообщений: 8,717
Записей в блоге: 3
29.07.2021, 13:55
Цитата Сообщение от kolorotur Посмотреть сообщение
код выше при такой постановке должен работать
Foo(655, 2728, 3, 8) = 687, должен быть 2680.
Т.е. как ни крути - один из "правильных" примеров не пролазит.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.07.2021, 14:14
Цитата Сообщение от wizard41 Посмотреть сообщение
должен быть 2680
Почему он должен быть 2680?

Если копировать из Б в А, получая на выходе Р то:
А: 0010101011112 = 65510
Б: 1010101010002 = 272810
Р: 0010101011112 = 68710


Биты, которые надо копировать из Б в А, выделены — с 3-го по 8-й, начиная с нуля.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3451 / 2772 / 575
Регистрация: 04.09.2018
Сообщений: 8,717
Записей в блоге: 3
29.07.2021, 14:20
kolorotur, и я о том же! Второй день долблю ТС, что у него ошибочные данные. Он утверждает, что должно быть 2680.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.07.2021, 14:22
Цитата Сообщение от wizard41 Посмотреть сообщение
и я о том же!
А, вон вы о чем — нашел сообщение на первой странице с этим примером.
Ну так в том примере хоть из А в Б, хоть из Б в А копировать — 2680 никак не получится
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3451 / 2772 / 575
Регистрация: 04.09.2018
Сообщений: 8,717
Записей в блоге: 3
29.07.2021, 14:23
Да, и еще нюанс: "копировать" здесь подразумевает вставить выборку из А в Б, оставив неизменными остальные биты Б, не попадающие в диапазон вставки.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.07.2021, 14:29
wizard41, естественно.

Добавлено через 4 минуты
Посмотрел остальные примеры: в каких-то случаях согласно примерам "правильно" копировать из А в Б, в каких-то — из Б в А...
В общем, нужно либо определиться откуда что копировать, либо в каком порядке должны идти аргументы в методы.
Благо в предложенном варианте это решается перестановкой местами А и Б в последней строчке метода.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3451 / 2772 / 575
Регистрация: 04.09.2018
Сообщений: 8,717
Записей в блоге: 3
29.07.2021, 14:42
kolorotur, ТС противоречит сам себе. Вот в этом посте он показывает пример вставки со значениями 655, 2728, 3, 8.
И тут все логично с получившимся результатом. Но вот с Foo(A: 554216104, B: 15, start: 0, end: 31) = 15 он не замечает, что выборка 32 бит, начиная с 0-го из А равна А, соответственно вставив А в В он затрет изначальное В = 15, и В станет равным А. С чего он решил, что должно остаться 15?
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
29.07.2021, 14:46
kolorotur,
Скопировать первые end - start + 1 битов из
Из Б в А
А: 001010001111 => 655
Б: 101010101000 => 2728
Р: 001101000111 => 839

Из А в Б
А: 001010001111 => 655
Б: 101010101000 => 2728
Р: 101001111000 => 2680

Но если из А в Б, тогда из первого поста примеры не пройдут. В общем, да, где-то косяк.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.07.2021, 14:46
Помогаю со студенческими работами здесь

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru