С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
ivani493
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 2
#1

Побитовые операции (программа, которая интерпретирует старшие 3 бита как некоторое число n...) - C++

23.01.2013, 14:05. Просмотров 1494. Ответов 23
Метки нет (Все метки)

Уважаемые форумчане, нужна ваша помощь.
Нужно составить программу, которая интерпретирует старшие 3 бита как некоторое число n и оставшиеся разряды сдвинуть циклически влево на n разрядов.
За помощь буду очень благодарен!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2013, 14:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Побитовые операции (программа, которая интерпретирует старшие 3 бита как некоторое число n...) (C++):

Как обнулить первые 4-е бита начиная с певого заряженного (первые - старшие биты) - C++
Собственно, вопрос в заголовке.

Работа со стеком. Программа, которая к вершине стека добавляет некоторое число, а следующему элементу присваивает значение предыдущего - C++
Есть некоторый стек, в каждом элементе которого записаны по два целых числа. Нужно сделать программу которая к вершине стека добавляет...

Побитовые операции. Получить целое число, отбросив нечётные биты данного числа k - C++
Разработать алгоритм и составить программы на языке Си для решения задачи. Bo всех случаях, где возможно, использовать побитовые операции. ...

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

Функции. побитовые операции. Написать функцию, которая для заданного целого числа Х вычисляет количество единичных битов в этом числе - C++
Здравствуйте, уважаемые мастера программирования. Нуждаюсь в вашей помощи. Написать функцию, которая для заданного целого числа Х...

Извлечь 3 бита числа A, начиная со второго и вставить их в число B, начиная с первого бита - C++
Ввести целое A. Извлечь 3 бита числа A, начиная со второго и вставить их в число B, начиная с ервогоп бита. B=1A05h.

23
vua72
416 / 416 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
27.01.2013, 00:16 #16
Единственное, этот алгоритм корректно работает с беззнаковыми, а тупому циклу все равно-знаковые или беззнаковые. Сразу соглашусь, что сдвиги вообще корректно применять к беззнаковым.
1
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,254
27.01.2013, 00:27 #17
Цитата Сообщение от vua72 Посмотреть сообщение
Сразу соглашусь, что сдвиги вообще корректно применять к беззнаковым.
имянно
если простой сдвиг вправо (деление на 2) еще имеет место быть для знаковых
то для циклического результат ересь
да и как можно циклически сдвинуть -2?
циклический сдвиг это чисто битовая примочка

Цитата Сообщение от vua72 Посмотреть сообщение
Единственное, этот алгоритм корректно работает с беззнаковыми,
я как то забыл акцентировать на этом внимание в примере сделал а в объяснении нет

Не по теме:

вспоминаю как я переходил на С для микроконтроллеров
надо было сделать "бегуший огонь" туда-сюда влево нормально бежал а вправо набирался
пришлось делать на ассемблере
не знал я тогда разницы для сдвига вправо между signed и unsigned

0
Valli1
4 / 4 / 0
Регистрация: 14.09.2012
Сообщений: 64
27.01.2013, 00:50 #18
но это долго
есть способ проще
Спасибо за доходчивое разъяснение. Буду внедрять в практику.
0
vua72
416 / 416 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
27.01.2013, 02:21 #19
а вот и код дизассемблера для сдвига вправо
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
57                  return (val >> n % sz) | (val << (sz - n % sz));
                  fror(unsigned char, unsigned char):
0000000000400956:   movzx edi,dil
000000000040095a:   and esi,0x7
000000000040095d:   movzx edx,sil
0000000000400961:   mov ecx,0x8
0000000000400966:   sub ecx,edx
0000000000400968:   mov eax,edi
000000000040096a:   shl eax,cl
000000000040096c:   mov ecx,esi
000000000040096e:   sar edi,cl
0000000000400970:   or eax,edi
58                }
и виновник вытягивания знака
Assembler
1
sar edi,cl
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,254
27.01.2013, 02:32 #20
Цитата Сообщение от vua72 Посмотреть сообщение
а вот и код дизассемблера для сдвига вправо
если ты мне
то я давно уже знаю разницу между SHR (для беззнаковых) логический сдвиг
и SAR (для знаковых) арифметический сдвиг
0
vua72
416 / 416 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
27.01.2013, 02:35 #21
ValeryS, не, я осваивающему
0
Valli1
4 / 4 / 0
Регистрация: 14.09.2012
Сообщений: 64
27.01.2013, 22:20 #22
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
int main()
{
unsigned int t=2147483648;
unsigned int x=1234;
unsigned int i=0;
while(t>=x){
t=t>>1;
i++;}//отсуп от 32 бита
unsigned int t1=(32-i);//количество бит
unsigned int x2=x>>(t1-3);//значение 3х бит
unsigned int x3=x<<32-t1+3;//удаляем первые 3 бита
unsigned int x4=x3>>(32-t1+3);//восстанавливаем без 3х бит в исх. полож.
unsigned int x5=x4<<x2;//начало сдвига
unsigned int x6=x4>>(32-x2);
unsigned int x7=x5 | x6;//окончание сдвига 
std::cout<<x7<<'\n';
std::cin.get();
std::cin.get();
 
    return 0;
}
Добавлено через 3 часа 42 минуты
Правильно или нет. Я в начале не то скопировал с опечаткой.
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,254
27.01.2013, 22:24 #23
Цитата Сообщение от Valli1 Посмотреть сообщение
Правильно или нет.
смотря чего ты хотел
вот это например что
Цитата Сообщение от Valli1 Посмотреть сообщение
unsigned int t1=(32-i);//количество бит
количество бит чего?
0
Valli1
4 / 4 / 0
Регистрация: 14.09.2012
Сообщений: 64
28.01.2013, 00:20 #24
Все вроде правильно
x4=0.....11010010 это число сдвинуть на число равное первым 3м битам =x2=4
получилось0... 110100100000
потом сдвигаю x4 вправо 0....00000
суммма равна x5=x7.

Добавлено через 25 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
смотря чего ты хотел
вот это например что

количество бит чего?
I это количество бит от 32 до старшего(единичного) бита x.
Соответственно t1= (32-i) длина числа от младшего до старшего(единичного) бита(x)

Добавлено через 53 минуты
C++
1
2
3
unsigned int x5=x4>>x2;//начало циклич. сдвига
unsigned int x6=x4<<(32-x2);
//окончание сдвига
Если в лево сдвигать 14 и 15 заменить на это.
0
28.01.2013, 00:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2013, 00:20
Привет! Вот еще темы с ответами:

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

Побитовые операции - C++
Помогите, не могу понять как сделать эту программу( unsigned ChangeGroupBits(unsigned x, unsigned y, int n1, int n2); ChangeGroupBits–...

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

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


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

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

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