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

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

Войти
Регистрация
Восстановить пароль
 
glosha
0 / 0 / 0
Регистрация: 04.11.2013
Сообщений: 17
#1

Поразрядные операции - C++

04.11.2013, 17:58. Просмотров 444. Ответов 14
Метки нет (Все метки)

Помогите пожалуйста доделать программу, :даны два int числа: N1 = ABCD и N2 = EFGH, где AB…GH – 16 – ричные цифры. Образовать long число HGFEABAB, используя только поразрядные операции. получаю число на выходе: EFFEABAB, помогите найти ошибку,чтобы вместо EF ,было HG:
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
#pragma argsused
1  long zadanie1 (int n1, int n2);
 
 
2  int main()
3 {
4    int n1 , n2;
5    long n; 
6    printf("BBeDuTe n1, n2: ");
7    scanf("%x%x", &n1, &n2);
8    n = zadanie1(n1, n2);
9    printf("N=%lx \n", n);
10    getch();
11  return 0;
12 }
 
13  long zadanie1 (int n1, int n2)
14 {
15   long n=0x0, AB,E,F,G, H;
16    AB = (n1 >> 8) & 0xFF;
17    E = (n2 >> 8) & 0xF;
18    F = (n2 >> 4) & 0xF;
19    G = n2 & 0xFF;
20    H = n2 & 0xFF;
21    n = n | (H << 4*6);
22    n = n | (G << 4*5);
23    n = n | (F << 4*4);
24    n = n | (E << 4*3);
25    n = n | (AB << 4*2);
26    n = n |  AB ;
27    return n;
28  }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2013, 17:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поразрядные операции (C++):

Поразрядные операции - C++
Есть 16-е число, например N=0xC5D612F7, помогите убрать единицу в старшем бите у C и F, используя поразрядные операции на языке Си. Я даже...

поразрядные операции - C++
помогите пожалуйста решить следущую задачу: даны два int-числа: N1 = АBCD и N2 = EFGH, где AB…GH – 16-ричные цифры, ПОп –...

Поразрядные операции - C++
Даны два int-числа: N1 = ABCD и N2 = EFGH, где AB…GH – 16 – ричные цифры. Образовать long-число DEGHDABF, используя только поразрядные...

Поразрядные операции - C++
Обьясните пожалуйста работу поразрядных операций (&amp;, |, ^, &lt;&lt;, &gt;&gt;, ~). Например, n=n&amp;0177; - обнуляет все биты переменной N, кроме младших...

Поразрядные операции - C++
Запрограммировать изменение четырехбайтного числа (unsigned int) так, чтобы байт последовательно заполнялся сначала единицами, а затем...

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

14
gng
645 / 491 / 133
Регистрация: 08.09.2013
Сообщений: 1,326
04.11.2013, 19:05 #2
Цитата Сообщение от glosha Посмотреть сообщение
Помогите пожалуйста доделать программу, :даны два int числа: N1 = ABCD и N2 = EFGH, где AB…GH – 16 – ричные цифры. Образовать long число HGFEABAB, используя только поразрядные операции. получаю число на выходе: EFFEABAB, помогите найти ошибку,чтобы вместо EF ,было HG:
return ((n2 & 0xF<< 56)) | ((n2 & 0xFO) << 40) | ((n2 & 0xFOO) << 24) | ((n2 & 0xFOOO) << 8)
| ((n1 & 0xFF00) >> 32 | ((n1 & 0xFF00) >> 48;

Добавлено через 2 минуты
Извивяюсь
return ((n2 & 0xF<< 56)) | ((n2 & 0xFO) << 40) | ((n2 & 0xFOO) << 24)
| ((n2 & 0xFOOO) << 8) | ((n1 & 0xFF00) | ((n1 & 0xFF00) >> 16);
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
04.11.2013, 19:09 #3
Цитата Сообщение от glosha Посмотреть сообщение
даны два int числа: N1 = ABCD и N2 = EFGH, где AB…GH – 16 – ричные цифры.
Я сильно сомневаюсь что G и H шестнадцатеричные цифры..
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
04.11.2013, 19:14 #4
Цитата Сообщение от glosha Посмотреть сообщение
N1 = ABCD и N2 = EFGH, где AB…GH – 16 – ричные цифры.
по моему
шестнадцатеричные цифры это
0 1 2 3 4 5 6 7 8 9 A B C D E F
если изобретен другой алфавит просьба сообщить
Цитата Сообщение от glosha Посмотреть сообщение
даны два int числа:
int какого размера?

Добавлено через 2 минуты
Цитата Сообщение от glosha Посмотреть сообщение
Образовать long число HGFEABAB, используя только поразрядные операции.
сдвинуть второе число влево на 16 разрядов,а не в право, и использовать оператор "ИЛИ"
0
gng
645 / 491 / 133
Регистрация: 08.09.2013
Сообщений: 1,326
04.11.2013, 19:41 #5
Цитата Сообщение от ValeryS Посмотреть сообщение
по моему
шестнадцатеричные цифры это
0 1 2 3 4 5 6 7 8 9 A B C D E F
если изобретен другой алфавит просьба сообщить
Шестнадцатиричные цифры, как и числа, можно обозначить переменными: x,y H, G...
Ваш КО
Цитата Сообщение от ValeryS Посмотреть сообщение
int какого размера?
Начиная с 16 бит задача вполне корректна. А меньших интов вроде нет
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
04.11.2013, 19:54 #6
Цитата Сообщение от gng Посмотреть сообщение
Ваш КО
КО объясни
Цитата Сообщение от glosha Посмотреть сообщение
N1 = ABCD и N2 = EFGH,
ABCD это значения или переменные ???? почему нужно додумывать?
и это тоже
Цитата Сообщение от glosha Посмотреть сообщение
получаю число на выходе: EFFEABAB,
Цитата Сообщение от glosha Посмотреть сообщение
EF ,было HG:
где значения где переменные?
Цитата Сообщение от gng Посмотреть сообщение
Начиная с 16 бит задача вполне корректна.
разумеется
Цитата Сообщение от glosha Посмотреть сообщение
Образовать long число
long чему равен????
по стандарту он не меньше int 16 32 64?????
поехали дальше

Добавлено через 2 минуты
Цитата Сообщение от gng Посмотреть сообщение
Начиная с 16 бит задача вполне корректна.
это вот это то???
Цитата Сообщение от gng Посмотреть сообщение
(n2 & 0xF<< 56))
это ты для 16 бит на 56 сдвигаешь?
1
gng
645 / 491 / 133
Регистрация: 08.09.2013
Сообщений: 1,326
04.11.2013, 20:08 #7
Цитата Сообщение от ValeryS Посмотреть сообщение
КО объясни
ABCD это значения или переменные ???? почему нужно додумывать?
и это тоже

где значения где переменные?
Везде переменные A,B,C,E,F,G,H - обозначают 16-ричные цифры


Цитата Сообщение от ValeryS Посмотреть сообщение
это вот это то???
это ты для 16 бит на 56 сдвигаешь?
Я писал о корректности задания
Мое решение корректно начиная с 32 бит.
Я действительно ошибся со сдвигами в два раза, спасибо.
C
1
2
return ((n2 & 0xF<< 28)) | ((n2 & 0xFO) << 20) | ((n2 & 0xFOO) << 12) 
| ((n2 & 0xFOOO) << 4) | ((n1 & 0xFF00) | ((n1 & 0xFF00) >> 8);
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
04.11.2013, 20:54 #8
вот так все это решается
поменять байты между собой
(a<<8) | (a>>8)
для 16 битного инта циклический сдвиг на 8
переменная должна быть обязательно unsigned при знаковой переменной при сдвиге вправо старший(знаковый) бит копируется а при беззнаковой в старших разрядах 0
итого вся функция выглядит так
C++
1
2
3
4
unsigned long int fnc(unsigned int a, unsigned int b)
{
return ((a<<8)|(a>>8)) |((b<<8)|(b>>8))<<16;
}
пардон ответ не тот

вот который задан

C++
1
2
3
4
5
6
7
8
unsigned long int fnc(unsigned int a, unsigned int b)
{
unsigned char n1=b;
unsigned char n2=b>>8;
n1=(n1<<4) | (n1>>4);
n2=(n2<<4) | (n2>>4);
return ((a&0xF0)|(a>>8)) |(((n1<<8)|n2)<<16);
}
0
castaway
04.11.2013, 21:41
  #9

Не по теме:

Цитата Сообщение от gng Посмотреть сообщение
Везде переменные A,B,C,E,F,G,H - обозначают 16-ричные цифры
Что за бред сивой кобылы?

0
gng
645 / 491 / 133
Регистрация: 08.09.2013
Сообщений: 1,326
04.11.2013, 21:58 #10
Цитата Сообщение от castaway Посмотреть сообщение

Не по теме:

Что за бред сивой кобылы?

Никто не мешает цифру обозначить переменной.
При такой трактовке задача обретает вполне определенный смысл.
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
04.11.2013, 22:07 #11
Цитата Сообщение от gng Посмотреть сообщение
Никто не мешает цифру обозначить переменной.
нормальные люди пишут так
даны два шестнадцатеричных числа n1n2n3n4 и m1m2m3m4

получить число m4m3m2m1n1,n2n1,n2
используя поразрядные операции

и все никаких разночтений
0
gng
645 / 491 / 133
Регистрация: 08.09.2013
Сообщений: 1,326
04.11.2013, 22:16 #12
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
unsigned long int fnc(unsigned int a, unsigned int b)
{
unsigned char n1=b;
unsigned char n2=b>>8;
n1=(n1<<4) | (n1>>4);
n2=(n2<<4) | (n2>>4);
return ((a&0xF0)|(a>>8)) |(((n1<<8)|n2)<<16);
}
Уже почти правильно. Осталось внимательнее почитать условие. Двигаются не только байты, но и четверки битов.

Добавлено через 4 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
нормальные люди пишут так
даны два шестнадцатеричных числа n1n2n3n4 и m1m2m3m4

получить число m4m3m2m1n1,n2n1,n2
используя поразрядные операции

и все никаких разночтений
Адресуйте Вашу рекомендацию преподавателю статртопика.
Я всего лишь предположил, что задание давал не дурак.
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
04.11.2013, 22:34 #13
Цитата Сообщение от gng Посмотреть сообщение
Я всего лишь предположил, что задание давал не дурак.
сомнительно, с таким ТЗ на любом предприятии был бы послан
Цитата Сообщение от gng Посмотреть сообщение
Уже почти правильно. Осталось внимательнее почитать условие. Двигаются не только байты, но и четверки битов.
четверки байтов называются полубайты
тебе по шагам расписать

пожалуйста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
unsigned long int fnc(unsigned int a, /*число q1q2q3q4*/
 unsigned int b /* число m1m2m3m4*/ )
{
unsigned char n1=b;// заносим младший байт числа b  m3m4
unsigned char n2=b>>8;// заносим старший байт числа b  m1m2
n1=(n1<<4) | (n1>>4); // циклический сдвиг байта на 4 старший и младший полубайт меняются местами m4m3
n2=(n2<<4) | (n2>>4);// циклический сдвиг байта на 4 старший и младший полубайт меняются местами m2m1
return ((a&0xF0)// выделяем старший байт q1q200
|(a>>8))  // старший байт сдвигаем на 8 получаем 00q1q2 после операции или число равно q1q2 q1q2 
|(((n1<<8)  // сдвигаем вправо на 8 получаем m4m300
|n2)  // после операции или получаем m4m3m2m1
<<16); // после сдвига m4m3m1m20000 после операции или m4m3m2m1q1q2q1q2
}  // возвращаем число m4m3m2m1q1q2q1q2
что еще куда сдвинуть нужно????
0
gng
645 / 491 / 133
Регистрация: 08.09.2013
Сообщений: 1,326
04.11.2013, 22:49 #14
Цитата Сообщение от ValeryS Посмотреть сообщение
сомнительно, с таким ТЗ на любом предприятии был бы послан
четверки байтов называются полубайты
тебе по шагам расписать
Зачем же.
Проще попробовать программу в работе и исправить ошибку. Она, похоже, допущена вами по невнимательности.
в восьмой строке последнего листинга.

Добавлено через 9 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
сомнительно, с таким ТЗ на любом предприятии был бы послан
А студенты небось еще и двойки получат, если не разгадают головоломку с условием
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
04.11.2013, 22:59 #15
Цитата Сообщение от gng Посмотреть сообщение
Она, похоже, допущена вами по невнимательности.
в восьмой строке последнего листинга.
и в чем ошибка?
Цитата Сообщение от glosha Посмотреть сообщение
N1 = ABCD и N2 = EFGH, где AB…GH – 16 – ричные цифры. Образовать long число HGFEABAB,
CD теряется а AB дублируется
Цитата Сообщение от ValeryS Посмотреть сообщение
(a&0xF0)// выделяем старший байт q1q200
|(a>>8)) *// старший байт сдвигаем на 8 получаем 00q1q2 после операции или число равно q1q2 q1q2
Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
(a&0xF0)
вот это что ли 0xFF
согласен косячек, клавиатура залипла а я внимания не обратил

Добавлено через 1 минуту
но изначально ты утверждал
Цитата Сообщение от gng Посмотреть сообщение
Двигаются не только байты, но и четверки битов.
я показал что они двигаются
а рабочую программу я и не собирался писать
0
04.11.2013, 22:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2013, 22:59
Привет! Вот еще темы с ответами:

Поразрядные операции - C++
Здравствуйте. Объясните, пожалуйста, есть задача: выполнить поразрядное «или» 0-5 разрядов В и 0-3 разрядов С, сдвинутых вправо на 2...

Поразрядные операции - C++
Написать функцию, которая в числе x устанавливает 0 в n бит, находящихся справа от позиции p, остальные биты остаются без изменения.

Поразрядные операции (&,|,^) - C++
Здравствуйте! Объясните мне начинающему тогодуму как тут получается на выходе , а то я что-то не соображу #include &lt;iostream.h&gt; ...

Поразрядные операции, объясните смысл выражений - C++
День добрый, начинаю изучать поразрядные операции,вот попался пример#include &lt;iostream&gt; #include &lt;stdio.h&gt; using namespace std; ...


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

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

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