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

Битовые операции - перемещение бит для unsigned int - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.89
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
01.03.2012, 21:13     Битовые операции - перемещение бит для unsigned int #1
Помогите разобраться,

задание:
Создайте функцию, которая перемещает биты для unsigned int на 30 бит в право, причем
выходящие при сдвиге за правую границу переменной биты должны "вталкиваться" в переменную с левой
стороны.

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
#include <iostream>
#include <iomanip>
#include <Windows.h>
 
using namespace std;
 
void DisplayBits ( unsigned int);
void main()
{
unsigned int number1;
 
cin >> number1;
 
DisplayBits(number1 >> 30 );
system("PAUSE");
}
 
 
 
 
void DisplayBits (unsigned int value)
{
 
unsigned int c = 0;
unsigned int displayMask = 1 << 31;
 
cout << setw(12) << value << " = ";
 
 for (c = 1; c <= 32; c++)
 {
    cout << (value & displayMask ? '1' : '0');
    displayMask >>=1;
    if ( c % 8 == 0 )
    {
        cout << ' ';
    }
 
 }
  cout << endl;
}
Не знаю, как сделать - "при сдвиге за правую границу переменной биты должны "вталкиваться" в переменную с левой"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
01.03.2012, 21:47     Битовые операции - перемещение бит для unsigned int #2
если в 31 разряде стоит единица
смести ть 1 бит вправо
число++
иначе
сместить на 1 бит вправо
x1Mike7x
 Аватар для x1Mike7x
214 / 127 / 6
Регистрация: 06.11.2010
Сообщений: 234
01.03.2012, 21:49     Битовые операции - перемещение бит для unsigned int #3
Как-то так
C++
1
2
3
4
5
6
7
8
9
10
11
unsigned foo( unsigned x )
{
    unsigned t;
    for ( int i = 0; i < 30; ++i )
    {
        t = ( x & 1 ) << 31;
        x >>= 1;
        x |= t;
    }
    return x;
}
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,058
01.03.2012, 21:52     Битовые операции - перемещение бит для unsigned int #4
а на асме можно??
там всего одна команда

Не по теме:

почему в С не предусмотрели циклический сдвиг

jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
01.03.2012, 22:04  [ТС]     Битовые операции - перемещение бит для unsigned int #5
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
#include <iostream>
#include <iomanip>
#include <Windows.h>
 
using namespace std;
 
void DisplayBits ( unsigned int);
void main()
{
unsigned int number1;
 
unsigned foo( unsigned x )
{
    unsigned t;
    for ( int i = 0; i < 30; ++i )
    {
        t = ( x & 1 ) << 31;
        x >>= 1;
        x |= t;
    }
    return x;
} 
 
DisplayBits(foo());
system("PAUSE");
}
 
 
 
 
void DisplayBits (unsigned int value)
{
 
unsigned int c = 0;
unsigned int displayMask = 1 << 31;
 
cout << setw(12) << value << " = ";
 
 for (c = 1; c <= 32; c++)
 {
    cout << (value & displayMask ? '1' : '0');
    displayMask >>=1;
    if ( c % 8 == 0 )
    {
        cout << ' ';
    }
 
 }
  cout << endl;
}
Вроде, все вставил, но не могу понять почему у меня нули все время выводит?

C++
1
t = ( x & 1 ) << 31;
- и вот эта строчка не очень понятна << 31, не могли бы вы пояснить?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,058
01.03.2012, 22:12     Битовые операции - перемещение бит для unsigned int #6
Цитата Сообщение от jvov Посмотреть сообщение
t = ( x & 1 ) << 31;
- и вот эта строчка не очень понятна << 31, не могли бы вы пояснить?
это для
Цитата Сообщение от jvov Посмотреть сообщение
биты должны "вталкиваться" в переменную с левой
стороны.
Добавлено через 2 минуты
Цитата Сообщение от jvov Посмотреть сообщение
Вроде, все вставил, но не могу понять
ты уверен что в си вложенные функции есть ( они будут работать)?
Цитата Сообщение от jvov Посмотреть сообщение
C++
1
2
3
4
5
6
7
void main()
{
unsigned int number1;
unsigned foo( unsigned x )
{
 unsigned t;
 for ( int i
что ты этим хотел сообшить?
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
01.03.2012, 22:31  [ТС]     Битовые операции - перемещение бит для unsigned int #7
Цитата Сообщение от ValeryS Посмотреть сообщение

ты уверен что в си вложенные функции есть ( они будут работать)?
Я просто, только начал изучать С++, по этому не знал, что тут нету вложенных функций.

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
#include <iostream>
#include <iomanip>
#include <Windows.h>
 
using namespace std;
 
void DisplayBits ( unsigned int);
unsigned foo( unsigned );
 
void main()
{
unsigned int number1;
//cin >> number1;
unsigned foo( unsigned x )
{
    unsigned t;
    for ( int i = 0; i < 30; ++i )
    {
        t = ( x & 1 ) << 31;
        x >>= 1;
        x |= t;
    }
    return x;
} 
 
number1 := foo(23);
DisplayBits(number1);
system("PAUSE");
}
 
 
 
 
void DisplayBits (unsigned int value)
{
 
unsigned int c = 0;
unsigned int displayMask = 1 << 31;
 
cout << setw(12) << value << " = ";
 
 for (c = 1; c <= 32; c++)
 {
    cout << (value & displayMask ? '1' : '0');
    displayMask >>=1;
    if ( c % 8 == 0 )
    {
        cout << ' ';
    }
 
 }
  cout << endl;
}
опять не работает?
x1Mike7x
 Аватар для x1Mike7x
214 / 127 / 6
Регистрация: 06.11.2010
Сообщений: 234
01.03.2012, 23:51     Битовые операции - перемещение бит для unsigned int #8
http://codepad.org/hPEZQkUT

P.S. Можно даже так: http://codepad.org/P5yWxHLW =)

P.P.S. Всё это, конечно же, для sizeof( int ) == 4
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
02.03.2012, 00:44  [ТС]     Битовые операции - перемещение бит для unsigned int #9
Цитата Сообщение от x1Mike7x Посмотреть сообщение
http://codepad.org/hPEZQkUT

P.S. Можно даже так: http://codepad.org/P5yWxHLW =)

P.P.S. Всё это, конечно же, для sizeof( int ) == 4
Огромное спасибо!
ibmpc
 Аватар для ibmpc
78 / 76 / 2
Регистрация: 29.12.2011
Сообщений: 183
02.03.2012, 10:35     Битовые операции - перемещение бит для unsigned int #10
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
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdint.h>
/*
 * задание:
Создайте функцию, которая перемещает биты для unsigned int на 30 бит в право, причем
выходящие при сдвиге за правую границу переменной биты должны "вталкиваться" в переменную с левой
стороны.
 */
// извлекает бит числа Нумерация с ПРАВА с 1
int get_flag(uint64_t x, int i)
{
    assert(i > 0);
    assert(i <= sizeof(x)*8);
    // усечение + & 1
    return x >> (i-1) & 1;
}
 
//Extracting bit-fields
uint32_t extract_bit_fields(uint32_t x, int count)
{
// вынимает count битов С ПРАВОЙ СТОРОНЫ
    return (x & ((2<<count-1)-1));
}
 
uint32_t replace_bit_fields(uint32_t x, uint32_t y, int count)
{
   // сбросить в 0 биты, которые будут устанавливаться
   // | с новым значением
    return ( (x & ((2<<(sizeof(x)*8-count)-1)-1)) | y);
}
 
void view(uint32_t x)
{
    for(register int i=sizeof(uint32_t)*8;i>0;i--)
    {
        printf("%i",get_flag(x,i));
        if (ferror(stdout)) perror(" Error stdout ");
    }
    assert(putchar('\n')!=EOF);
}
 
int main(int argc, char** argv)
{
    // число
    uint32_t a = 1;
    printf("Num\n");
    view(a);
    // вынуть 30 bit с ПРАВА и сдвинуть для послкдуюшей установки с лева
    uint32_t t = extract_bit_fields(a,30) << 32-30;
    // заменить в сдвинутом числе биты битами из t
    t = replace_bit_fields(a>>30,t, 30);
    printf("Num >> 30\n");
    view(t);
 
    return (EXIT_SUCCESS);
}
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
02.03.2012, 23:34  [ТС]     Битовые операции - перемещение бит для unsigned int #11
Цитата Сообщение от x1Mike7x Посмотреть сообщение
Как-то так
C++
1
2
3
4
5
6
7
8
9
10
11
unsigned foo( unsigned x )
{
    unsigned t;
    for ( int i = 0; i < 30; ++i )
    {
        t = ( x & 1 ) << 31;
        x >>= 1;
        x |= t;
    }
    return x;
}
Не могли бы вы объяснить, что каждая строчка делает? Что то я толком не понимают
C++
1
 t = ( x & 1 ) << 31;
- эта сдвигает влево на 31 и смотрит есть ли там "1"?

C++
1
 x >>= 1;
- сдвигает влево на 1

C++
1
 x |= t;
- а вот с этой не очень понятно? она делает "ИЛИ", но не могу понять суть?

Извините за глупые вопросы.
x1Mike7x
 Аватар для x1Mike7x
214 / 127 / 6
Регистрация: 06.11.2010
Сообщений: 234
03.03.2012, 01:03     Битовые операции - перемещение бит для unsigned int #12
1) Сдвигаем самый правый бит в самую левую позицию.
2) Сдвигаем биты на 1 позицию вправо.
3) Накладываем битовым "или" два числа, чтобы установить тот бит, что был крайним справа стал крайним слева.

Пример ( для 8 разрядов, для 32 - аналогично ).
Число в битовом представлении: 11000101
1.1 Берем крайний справа бит 11000101
1.2 Выделяем его ( x & 1 ) 00000001
1.3 Перемещаем в начало, получаем 10000000
2.1 Сдвигаем начальное число, получаем 11000101 >> 1 = 01100010
3.1 Делаем побитовое или 10000000 | 01100010 = 11100010
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2012, 01:10     Битовые операции - перемещение бит для unsigned int
Еще ссылки по теме:

C++ Определение типов. Приведение int к unsigned int
Битовые поля. Обращение к unsigned long C++
нужна зарезервированная макро константа для максимального значения unsigned int C++

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

Или воспользуйтесь поиском по форуму:
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
03.03.2012, 01:10  [ТС]     Битовые операции - перемещение бит для unsigned int #13
Цитата Сообщение от x1Mike7x Посмотреть сообщение
1) Сдвигаем самый правый бит в самую левую позицию.
2) Сдвигаем биты на 1 позицию вправо.
3) Накладываем битовым "или" два числа, чтобы установить тот бит, что был крайним справа стал крайним слева.

Пример ( для 8 разрядов, для 32 - аналогично ).
Число в битовом представлении: 11000101
1.1 Берем крайний справа бит 11000101
1.2 Выделяем его ( x & 1 ) 00000001
1.3 Перемещаем в начало, получаем 10000000
2.1 Сдвигаем начальное число, получаем 11000101 >> 1 = 01100010
3.1 Делаем побитовое или 10000000 | 01100010 = 11100010
Огромнейшее спасибо!
Yandex
Объявления
03.03.2012, 01:10     Битовые операции - перемещение бит для unsigned int
Ответ Создать тему
Опции темы

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