Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
Palpatine
Сообщений: n/a
#1

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

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

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

Упражнение 2.6. Напишите
функцию setbits(x, p, n, y),
возвращающую значение x, в
котором n битов, начиная с p-й
позиции, заменены на n правых
разрядов из y (остальные биты не изменяются).
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2011, 15:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задача на побитовые операции (C++):

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

Побитовые операции в С++ - C++
Здраствуйте. Нужно написать программу которая будед считывать количество единичек (1) в побитовом представлении числа. Пример input: 15 ...

Побитовые операции - C++
Задание: Дано целое неотрицательное число. Определить количество составляющих его шестнадцатеричных цифр, содержащих в двоичном...

Побитовые операции - C++
От друга услышал идею о побитовой сортировки имен (например). К примеру, если у нас набор структурных переменных с анкетами работников, и...

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

Побитовые операции - C++
Всем доброго утра. Дана такая задача: есть два чсила,поменять местами 2 последние цифры этих чисел между собой, т.е. 2 последних Х заменить...

10
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
23.07.2011, 17:16 #2
Типа этого хотел.
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
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,482
23.07.2011, 20:32 #3
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
1648 / 1276 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
23.07.2011, 21:53 #4
возможно не самый короткий способ
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
Нарушитель
Эксперт С++
4667 / 2873 / 232
Регистрация: 12.12.2009
Сообщений: 7,305
Записей в блоге: 2
Завершенные тесты: 1
23.07.2011, 22:31 #5
Может слишком замудрено, но все же:
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
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,482
23.07.2011, 23:46 #6
Сдвигание на p ничё не даст. Наверное, надо сдвигать на 32- n- p?
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
23.07.2011, 23:55 #7
если не для микроконтроллера пишем...

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
exkilla
3 / 3 / 0
Регистрация: 28.12.2009
Сообщений: 73
24.07.2011, 00:04 #8
Цитата Сообщение от alex_x_x Посмотреть сообщение
если не для микроконтроллера пишем...
А если для микроконтроллера, то что нужно было бы учесть?
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
24.07.2011, 00:05 #9
exkilla, ну программа была бы на си и там был бы один из вышепредставленных вариантов (с точки зрения производительности)
1
stdcout
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 210
24.07.2011, 08:42 #10
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
Нарушитель
Эксперт С++
4667 / 2873 / 232
Регистрация: 12.12.2009
Сообщений: 7,305
Записей в блоге: 2
Завершенные тесты: 1
24.07.2011, 11:45 #11
Цитата Сообщение от 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
24.07.2011, 11:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2011, 11:45
Привет! Вот еще темы с ответами:

Побитовые операции - C++
Помогите пожалуйста, никак не могу справиться с этой задачкой. Выделить из числа x поле шириной n битов, начиная с позиции p, и...

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

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

Побитовые операции - C++
Задача должна быть реализована в с++ но пришлось временно писать в дельфи. суть такая: входящие число в диапазоне 0-n (8 байт) выходящие...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru