Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/35: Рейтинг темы: голосов - 35, средняя оценка - 5.00
1 / 1 / 4
Регистрация: 28.09.2011
Сообщений: 113
1

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

01.03.2012, 21:13. Показов 6550. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите разобраться,

задание:
Создайте функцию, которая перемещает биты для 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;
}
Не знаю, как сделать - "при сдвиге за правую границу переменной биты должны "вталкиваться" в переменную с левой"
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2012, 21:13
Ответы с готовыми решениями:

Битовые операции, n-ый бит
Подскажите, пожалуйста! Дано число x. Как установить на место n-ого бита единицу? Вот, что...

Изменить знак числа типа int на противоположный, используя битовые операции.
помогите

Доступны ли побитовые операции с unsigned char типом (одно-байтовой переменной) без неявного приведения к INT
Отказавшись от bitset мне удалось ускорить работу программы примерно в 2,25 раза Вот её код (ребят...

Как исправить ошибку невозможно преобразовать аргумент 1 из "unsigned int" в "unsigned int []"?
Ребят, срочно прошу вас помочь.. Есть ошибка (невозможно преобразовать аргумент 1 из &quot;unsigned...

12
13 / 13 / 6
Регистрация: 05.12.2011
Сообщений: 84
01.03.2012, 21:47 2
если в 31 разряде стоит единица
смести ть 1 бит вправо
число++
иначе
сместить на 1 бит вправо
0
222 / 135 / 19
Регистрация: 06.11.2010
Сообщений: 234
01.03.2012, 21:49 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;
}
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
01.03.2012, 21:52 4
а на асме можно??
там всего одна команда

Не по теме:

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

0
1 / 1 / 4
Регистрация: 28.09.2011
Сообщений: 113
01.03.2012, 22:04  [ТС] 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, не могли бы вы пояснить?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
01.03.2012, 22:12 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
что ты этим хотел сообшить?
0
1 / 1 / 4
Регистрация: 28.09.2011
Сообщений: 113
01.03.2012, 22:31  [ТС] 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;
}
опять не работает?
0
222 / 135 / 19
Регистрация: 06.11.2010
Сообщений: 234
01.03.2012, 23:51 8
http://codepad.org/hPEZQkUT

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

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

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

P.P.S. Всё это, конечно же, для sizeof( int ) == 4
Огромное спасибо!
0
80 / 78 / 10
Регистрация: 29.12.2011
Сообщений: 183
02.03.2012, 10:35 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);
}
1
1 / 1 / 4
Регистрация: 28.09.2011
Сообщений: 113
02.03.2012, 23:34  [ТС] 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;
- а вот с этой не очень понятно? она делает "ИЛИ", но не могу понять суть?

Извините за глупые вопросы.
0
222 / 135 / 19
Регистрация: 06.11.2010
Сообщений: 234
03.03.2012, 01:03 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
1
1 / 1 / 4
Регистрация: 28.09.2011
Сообщений: 113
03.03.2012, 01:10  [ТС] 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
Огромнейшее спасибо!
0
03.03.2012, 01:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2012, 01:10
Помогаю со студенческими работами здесь

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

Поместить двоичный код, в веденной строке, в переменную типа int и unsigned int.
Пользователь вводит двоичную строку (32 символа). Поместить двоичный код, в веденной строке, в...

Битовые операции, битовые поля.
Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций....

Битовые поля. Обращение к unsigned long
Для типа данных unsigned long обеспечить возможность доступа как к числу целиком, так и отдельно к...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru