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

Копирование битов из одного числа в другое

25.07.2021, 21:45. Показов 1927. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Скопировать первые end - start + 1 битов из A и вставить в B, начиная с позиции start по позицию end. Разрешается использовать только побитовые операции
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.07.2021, 21:45
Ответы с готовыми решениями:

Копирование из одного RichEdit в другое
Здравствуйте возник вопрос в richedit есть строка типа: 325 345 677 нужно скопировать каждое число в отдельный компонент richedit....

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

Копирование файла из одного места в другое
Доброе время суток. Как сделать чтоб после нажатия на кнопку файл из одной папки копировался в другую?

9
Нарушитель
10225 / 5655 / 1257
Регистрация: 12.03.2015
Сообщений: 26,180
25.07.2021, 23:27
пример давай.

Добавлено через 18 минут
Ахтунг! Не отлаживал, писал на заборе!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
/* Скопировать первые end - start + 1 битов из A и вставить в B, 
   начиная с позиции start по позицию end. Разрешается использовать 
   только побитовые операции*/
   
#define MAXDWORD ((uint32_t)(-1))  
   
uint32_t foo(uint32_t A, uint32_t B, uint8_t start, uint8_t end)
{
  uint32_t width = end - start + 1;
  uint32_t hole  = (MAXDWORD << (start + width)) | !(MAXDWORD << start); // дырка
  A &= MAXDWORD >> (32 - width);
  return (B & hole) | (A << start);
}
Перевёл с паскаля.
Delphi
1
2
3
4
5
6
7
8
9
// присвоение битового промежутка part длиной width в дв.слове src, начиная с бита shift.
function SetBitPart32(src, part: DWORD; const shift, width: byte): DWORD;
var
  hole: DWORD;
begin
  part:=   part and (MAXDWORD shr (32 - width)); // обрезаю вставку до длины width
  hole:=   (MAXDWORD shl (shift + width)) or not (MAXDWORD shl shift); // дырка
  result:= (src and hole) or (part shl shift); // результат
end;
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
26.07.2021, 01:46
Цитата Сообщение от SoBadDay Посмотреть сообщение
и вставить в B, начиная с позиции start по позицию end.
Что значит "вставить"? Сдвинуть уже существующие биты в B в сторону? Или перезаписать поверх существующих битов в B?
0
Нарушитель
10225 / 5655 / 1257
Регистрация: 12.03.2015
Сообщений: 26,180
26.07.2021, 08:30
пардон, только ща заметил:
C++
1
2
3
4
5
6
7
uint32_t foo(uint32_t A, uint32_t B, uint8_t start, uint8_t end)
{
  uint32_t width = end - start + 1;
  uint32_t hole  = (MAXDWORD << (start + width)) | ~(MAXDWORD << start); // дырка
  A &= MAXDWORD >> (32 - width);
  return (B & hole) | (A << start);
}
0
 Аватар для SoBadDay
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
26.07.2021, 22:51  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что значит "вставить"? Сдвинуть уже существующие биты в B в сторону? Или перезаписать поверх существующих битов в B?
Переписать поверх существующих

Добавлено через 5 часов 51 минуту
Цитата Сообщение от Verevkin Посмотреть сообщение
uint32_t foo(uint32_t A, uint32_t B, uint8_t start, uint8_t end)
{
uint32_t width = end - start + 1;
uint32_t hole = (MAXDWORD << (start + width)) | ~(MAXDWORD << start); // дырка
A &= MAXDWORD >> (32 - width);
return (B & hole) | (A << start);
}
Валится, при входных данных foo(554216104, 15, 0, 31) Должно быть 15, но выходной == 554216111. Также Ваше решение для uint, к сожалению, не работает для отрицательных чисел. В своем условии я по дурости явно не указал, но входные A и B имеют тип int
0
Нарушитель
10225 / 5655 / 1257
Регистрация: 12.03.2015
Сообщений: 26,180
26.07.2021, 23:34
Цитата Сообщение от SoBadDay Посмотреть сообщение
при входных данных foo(554216104, 15, 0, 31) Должно быть 15
Почему?
0
Заблокирован
27.07.2021, 00:20
Цитата Сообщение от SoBadDay Посмотреть сообщение
В своем условии я по дурости явно не указал, но входные A и B имеют тип int
для битовых операций нет никакой разницы представления данных (знаковые,беззнаковые, дробные, массивы ,классы).
При работе с битами все едино.

Verevkin, тестирую твою функцию, что то не так...

код тестировки :
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <bitset>
using std::bitset;
 
#define MAXDWORD ((uint32_t)(-1))  
uint32_t bitscopy(uint32_t A, uint32_t B, uint8_t start, uint8_t end)
{
  uint32_t width = end - start + 1;
  uint32_t hole  = (MAXDWORD << (start + width)) | ~(MAXDWORD << start); // дырка
  A &= MAXDWORD >> (32 - width);
  return (B & hole) | (A << start);
}
 
int main()
{
    int first = 256;
    int second = uint32_t(-1);
    std::cout << "first  value         : " << bitset<32>(first)  << std::endl;
    std::cout << "second value         : " << bitset<32>(second) << std::endl;
    std::cout << "copy start 4 len 5   : " << bitset<32>(bitscopy(first, second, 4, 8));
}
результат :
Code
1
2
3
first  value         : 00000000000000000000000100000000
second value         : 11111111111111111111111111111111
copy start 4 len 4   : 11111111111111111111111000001111
0
Нарушитель
10225 / 5655 / 1257
Регистрация: 12.03.2015
Сообщений: 26,180
27.07.2021, 09:23
Цитата Сообщение от SmallEvil Посмотреть сообщение
Verevkin, тестирую твою функцию, что то не так...
Признаю, мой косяк.
Вот так попробуй:
C++
1
2
3
4
5
6
7
// Эту магию вне Хогвардса юзать ЗАПРЕЩЕНО! :)))
int32_t bitscopy(uint32_t A, uint32_t B, uint8_t start, uint8_t end)
{
  assert(end >= start && start < 32 && end < 32);
  uint32_t hole  = ~(((1L << (end - start + 1)) - 1) << start); 
  return (B & hole) | ((A << start) & ~hole);
}
1
Заблокирован
27.07.2021, 10:51
del
0
Нарушитель
10225 / 5655 / 1257
Регистрация: 12.03.2015
Сообщений: 26,180
27.07.2021, 12:42
Цитата Сообщение от SmallEvil Посмотреть сообщение
Verevkin, так ничего же не поменялось
при старте отличном от нуля единица из исходных данных смещается
Так что косяка уже два, скоро будет косяк косяков ))
У меня не очень с битовыми, но займусь. То что плохо получается нужно практиковать )
Как так не поменялось? Я функцию с нуля переписал жэж.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.07.2021, 12:42
Помогаю со студенческими работами здесь

Графики копирование одного в другое окно
Chart1.Series.AssignValues(Chart2.Series); Chart1.Series.AssignValues(Chart2.Series); так я копировал из одного массива в другой,но...

копирование одного сигнала из окна в другое
имеется вот такая программа помогите сделать так ,чтобы сигнал который мы задаём можно было копировать в любое окно и манипулировать этим...

Копирование текста из одного окна в другое
Здравствуйте! Интересно узнать ваше мнение по поводу следующей задачи. Есть текстовый документ (Word) и страница браузера (Опера)....

Копирование текста из одного текстового окна в другое
Как написать процедуру обработки события нажатия кнопки, которая реализует действия: копирование текста из одного текстового окна в другое...

Копирование из одного места в другое с ипользованием mutex
Копирование из одного места в другое с ипользованием мьютекса.Приложение должно работать как в windows 7 так и в linux Помогите написать...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru