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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
Palpatine
Сообщений: n/a
23.07.2011, 15:33     Задача на побитовые операции #1
объясните пожалуйста, как решить эту задачу:

Упражнение 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++ Побитовые операции
Побитовые операции C++
C++ Задача на побитовые операции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
 Аватар для xAtom
910 / 735 / 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;
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
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.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 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;
}
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 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);
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
23.07.2011, 23:46     Задача на побитовые операции #6
Сдвигание на p ничё не даст. Наверное, надо сдвигать на 32- n- p?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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;
}
exkilla
3 / 3 / 0
Регистрация: 28.12.2009
Сообщений: 68
24.07.2011, 00:04     Задача на побитовые операции #8
Цитата Сообщение от alex_x_x Посмотреть сообщение
если не для микроконтроллера пишем...
А если для микроконтроллера, то что нужно было бы учесть?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
24.07.2011, 00:05     Задача на побитовые операции #9
exkilla, ну программа была бы на си и там был бы один из вышепредставленных вариантов (с точки зрения производительности)
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);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2011, 11:45     Задача на побитовые операции
Еще ссылки по теме:

Побитовые операции C++
C++ побитовые операции
C++ побитовые операции

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

Или воспользуйтесь поиском по форуму:
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 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 вернула что-то не то (не помню при каких значениях).
Блин, не могу это повторить, хоту убей - не помню, может что попутал...
Yandex
Объявления
24.07.2011, 11:45     Задача на побитовые операции
Ответ Создать тему
Опции темы

Текущее время: 02:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru