Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/22: Рейтинг темы: голосов - 22, средняя оценка - 4.55
Palpatine

Задача на побитовые операции

23.07.2011, 15:33. Показов 4599. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
объясните пожалуйста, как решить эту задачу:

Упражнение 2.6. Напишите
функцию setbits(x, p, n, y),
возвращающую значение x, в
котором n битов, начиная с p-й
позиции, заменены на n правых
разрядов из y (остальные биты не изменяются).
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.07.2011, 15:33
Ответы с готовыми решениями:

Задача на побитовые операции
Дана задача,помогите пожалуйста с решением или подскажите примеры подобных программ. Сама задача: Даны три целых числа А, В, С. Если...

Побитовые операции
Напишіть програму, яка за даним числом N знаходить різницю між найбільшим і найменшим числом, які утворюються із бітів заданого числа. У...

Побитовые операции
Пожалуйста, объясните как работают побитовые операторы & и |. Например идет: i=03; j=01; k=i & j; // k=1 k=i | j; // k=3 А...

10
 Аватар для xAtom
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
23.07.2011, 17: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
#include <stdio.h>
 
 
size_t conj(size_t  p) {
   if(p > 16)  return 0xFFFFFFFF;
   else if(p > 8)  return 0xFFFF;
   return 0xFF;
}
 
 
size_t setbits(size_t x, size_t p, size_t n, size_t y) {
   return ((x >> p) << p) | (((y << n) >> n) & conj(n));
}
 
 
int main(void){
 
   size_t bit = setbits(0xEC34, 8, 8, 0xF3BF);
 
   printf("%X\n", bit);
 
   getchar();
  return 0;
}
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
23.07.2011, 20:32
size_t bit = setbits(0xEC34, 0, 32, 0xF3BF); должно дать при таком коде 0xF3BF; не даёт.
Ну Бог с ними с крайними значениями

size_t bit = setbits(0xEC34, 0, 31, 0xF3BF); Также должно дать 0XF3BF (на 32-разрядной машине), не даёт.
Дело в строчках типа
(y << n) >> n)

Наверное, сдвигать надо на 32- n.
0
 Аватар для igorrr37
2881 / 2028 / 992
Регистрация: 21.12.2010
Сообщений: 3,780
Записей в блоге: 9
23.07.2011, 21:53
возможно не самый короткий способ
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
30
31
32
#include <iostream>
 
void PrintNum(int num){
    std::cout<<num<<"\n";
    for(int i=31; i>=0; --i){
        std::cout<<((num>>i)&1);
        if(i%4==0) std::cout<<' ';
    }
    std::cout<<"\n";
}
 
void SetBits(int a, int pos, int n, int b){
    std::cout<<"a= ";
    PrintNum(a);
    std::cout<<"b= ";
    PrintNum(b);
    int tmp=0;
    for(int i=0; i<n; ++i){
        tmp=tmp|(1<<i);
    }
    b&=tmp;
    tmp=~(tmp<<pos);
    b=b<<pos;
    a=(a&tmp)|b;
    std::cout<<"result= ";
    PrintNum(a);
}
 
int main(){
    SetBits(-1,3,4,134);
    return 0;
}
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
23.07.2011, 22:31
Может слишком замудрено, но все же:
C++
1
2
3
int setbits(int x,int p,int n,int y){
    return (((x&((unsigned long int(pow(2.,n)-1)&y)<<p))^((unsigned long int(pow(2.,n)-1)&y)<<p))|((unsigned long int(pow(2.,n)-1)&y)<<p));
}

Цитата Сообщение от kravam Посмотреть сообщение
size_t bit = setbits(0xEC34, 0, 32, 0xF3BF); должно дать при таком коде 0xF3BF;
учел))

Добавлено через 4 минуты
более читабельно:
C++
1
2
3
4
int setbits(int x,int p,int n,int y){
    long unsigned int N=(long unsigned int(pow(2.,n)-1)&y)<<p;
    return (((x&N)^N)|N);
}
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
23.07.2011, 23:46
Сдвигание на p ничё не даст. Наверное, надо сдвигать на 32- n- p?
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
23.07.2011, 23:55
если не для микроконтроллера пишем...

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
#include <bitset>
#include <iostream>
 
int setbit( int x, size_t pos, size_t num, int y )
{
  std::bitset<sizeof(int) * 8> bitsetX( x ), bitsetY( y );
  for( unsigned i=0;i<num;++i )
  {
     /*
     std::cout << bitsetX[pos+i] << ' ' 
               << bitsetY[sizeof(int) * 8 - num + i] 
               << std::endl;
     */          
     bitsetX[ pos+i ] = bitsetY[ sizeof(int) * 8 - num + i ]; 
  }   
  
  return bitsetX.to_ulong();
}
 
//                                         ..98 7654 3210 
// 10d          = 0000 0000 0000 0000 0000 0000 0000 1010 b 
// 1005000004d  = 0011 1011 1110 0111 0001 0101 0100 0100 b
// 59d          = 0000 0000 0000 0000 0000 0000 0011 1011 b
 
int main() 
{
  std::cout << setbit( 10, 0, 8, 1005000004 ) << std::endl;
}
2
3 / 3 / 1
Регистрация: 28.12.2009
Сообщений: 73
24.07.2011, 00:04
Цитата Сообщение от alex_x_x Посмотреть сообщение
если не для микроконтроллера пишем...
А если для микроконтроллера, то что нужно было бы учесть?
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
24.07.2011, 00:05
exkilla, ну программа была бы на си и там был бы один из вышепредставленных вариантов (с точки зрения производительности)
1
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 209
24.07.2011, 08:42
C
1
2
3
4
int setbits(int x, int p, int n, int y)
{
     return (x & (((y | ~0 << n) << p) | (1 << p) - 1)) | ((y & (1 << n) - 1) << p);
}
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
24.07.2011, 11:45
Цитата Сообщение от kravam Посмотреть сообщение
Сдвигание на p ничё не даст. Наверное, надо сдвигать на 32- n- p?
Возможно ты мой алгоритм не понял, но код у меня все равно ошибочный (когда писал у меня уже пол второго ночи было, почти спал))
Но не ошибается тот, кто ничего не делает
Код исправил, так же написал вот такую штуковину:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <cmath>
using namespace std;
 
void PrintNum(int num){
    std::cout<<num<<"\n";
    for(int i=31; i>=0; --i){
        std::cout<<((num>>i)&1);
        if(i%4==0) std::cout<<' ';
    }
    std::cout<<"\n\n\n";
}
 //////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
int SetBits(int a, int pos, int n, int b){
    std::cout<<"\na= ";
    PrintNum(a);
    std::cout<<"b= ";
    PrintNum(b);
    int tmp=0;
    for(int i=0; i<n; ++i){
        tmp=tmp|(1<<i);
    }
    b&=tmp;
    tmp=~(tmp<<pos);
    b=b<<pos;
    a=(a&tmp)|b;
    return a;
}
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
 int setbits(int x,int p,int n,int y){
    typedef long unsigned int luint;
    luint N=luint(pow(2.,n)-1);
    luint mask=(luint(N&y)<<p);
    return (x&(~(N<<p))|mask);
}
 /////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////
#include <bitset>
int setbit( int x, size_t pos, size_t num, int y )
{
  std::bitset<sizeof(int) * 8> bitsetX( x ), bitsetY( y );
  for( unsigned i=0;i<num;++i )
  {
     /*
     std::cout << bitsetX[pos+i] << ' ' 
               << bitsetY[sizeof(int) * 8 - num + i] 
               << std::endl;
     */          
     bitsetX[ pos+i ] = bitsetY[ sizeof(int) * 8 - num + i ]; 
  }   
  
  return bitsetX.to_ulong();
}
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
int Setbits(int x, int p, int n, int y)
{
     return (x & (((y | ~0 << n) << p) | (1 << p) - 1)) | ((y & (1 << n) - 1) << p);
}
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
int main(){
    unsigned int x,y,n,p;
    while(std::cout<<"Enter x y n p (x & y in hex): "&&
                                        std::cin>>std::hex>>x>>y>>std::dec>>n>>p){
                std::cout<<"By igorrr37: "<<std::hex<<SetBits(x,p,n,y)<<std::endl
        <<"By alex_x_x: "<<std::hex<<setbit(x,p,n,y)<<std::endl
        <<"By stdcout: "<<std::hex<<Setbits(x,p,n,y)<<std::endl
        <<"By Kastaneda: "<<std::hex<<setbits(x,p,n,y)<<std::endl<<std::endl;
          }
    return 0;
}
потестил c разными значениями (скрин не прилагаю, т.к. в один скрин влазиет 1 тест, нет смысла)
Так вот: свой код, как и говорил, исправил. Функция alex_x_x возвращает отличное от остальных значение в 90% случаев, и было пару раз когда ф-ция от stdcout вернула что-то не то (не помню при каких значениях).

Добавлено через 2 минуты

Не по теме:

Вроде с функциями/авторами ничего не напутал, проверял...



Добавлено через 13 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
и было пару раз когда ф-ция от stdcout вернула что-то не то (не помню при каких значениях).
Блин, не могу это повторить, хоту убей - не помню, может что попутал...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.07.2011, 11:45
Помогаю со студенческими работами здесь

Побитовые операции
Помогите решить несколько задач по битовым операциям,они все малы по реализации. И объяснить начиная с 3 задачи,что нужно сделать?А то не...

Побитовые операции
У меня вопрос по правильности побитовых операций в моем коде: class Extracter :public AudioChecker { private: ...

Побитовые операции
Задача: битовый образ 8*8 задается при помощи 8 байт, каждый байт состоит, соответственно, из 8 бит, бит={0,1}; при помощи побитовых...

Побитовые операции
Здравствуйте, Подскажите пожалуйста, что тотникак не могу понять, что я делаю не так: сhar symv_chislo = 67; //10000011 ...

Побитовые операции
Здравствуйте уважаемые читатели форума! СОвсем не представляю как сделать простейшую програмку на С++. Нужно вычислить номер позиции...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru