Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
BonaBerry
3 / 3 / 0
Регистрация: 21.09.2013
Сообщений: 73
1

Определить, что старший байт числа равен значению переменной с

25.03.2014, 11:59. Просмотров 1721. Ответов 43
Метки нет (Все метки)

Вот такое задание.... Буду рада хотя бы алгоритму выполнения.
Дана переменная char c. Напишите цикл для подсчета в заданном диапазоне целых чисел (int) количества чисел, удовлетворяющих условию: старший байт числа равен значению переменной с.

Добавлено через 11 минут
И покажите, пожалуйста, еще как накладывать маски и пользоваться операторами " | & << >>> " Например, нужно:
00110011 11111111 000000000 010110101
превратить в такое, т.е. середику проинвертировать:
00110011 000000000 11111111 010110101


пока я могу только выводить число:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//  {
//    
//   int    y;
//   std::cout <<"Enter Number"<<endl;
//   cin>>y;
//   int  x=0,  vid, null;
//     int i=sizeof(int);// битовый оператор число в двоичном виде (0000)*8 =0000 0000 0000 00000
////******************************************************************************************/
//  /***ПЕРВОНОЧАЛЬНО*******/
//  std::cout <<"fist look:"<<endl;
//  for (int i=31; i>=0; i--)  // цикл перебора значений
//              {   
//                  vid=((y>>i)&1);    
//                  std::cout <<vid;
//              }
//                  std::cout << endl;
//system("Pause"); 
//      return 0;
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2014, 11:59
Ответы с готовыми решениями:

Для целого числа А выделить старший байт и поставить его на место младшего байта. старший байт при этом обнулить.
Помогите пожалуйста, вообще не могу понять как делать следующее...Еще и в...

Функция: изменить старший байт числа на заданное значение, не изменяя младший байт
функция изменяет старший байт числа на заданное значение не изменяя младший...

Считать старший байт числа
Добрый день подскажите пожалуйста! Как в переменную записать число 3 числа...

Определить, что куб суммы цифр числа равен квадрату числа
Кто может решите пожалуйста задачу с помощью циклов. Задание 5: Пользователь...

Вывести старший и младший байт заданного целого положительного числа в шестнадцатиричном и двоичном виде
Дано целое положительное число , тип int. Вывести старший и младший байт в 16ом...

43
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,940
25.03.2014, 12:12 2
Цитата Сообщение от BonaBerry Посмотреть сообщение
И покажите, пожалуйста, еще как накладывать маски и пользоваться операторами " | & << >>> " Например, нужно:
00110011 11111111 000000000 010110101
превратить в такое, т.е. середику проинвертировать:
00110011 000000000 11111111 010110101
если так как есть, т. е число 4 байта
то
C++
1
a^=0x00FFFF00;
Цитата Сообщение от BonaBerry Посмотреть сообщение
Дана переменная char c. Напишите цикл для подсчета в заданном диапазоне целых чисел (int) количества чисел, удовлетворяющих условию: старший байт числа равен значению переменной с.
если я правильно перевел
C++
1
2
3
4
5
6
7
8
for(int i=min; i<=max; i++)
{
 int tmp=c<<24;// создаем переменный в которой старший байт равен c
 int tmp1=i&0x00FFFFFF; // удаляем старший байт
 int tmp2=tmp1| tmp;  // создаем число 
printf(" %x,%d  %x,%d %x,%d  %x,%d  %x,%d" i,i,c,c,tmp,tmp,tmp1,tmp1,tmp2,tmp2);
 
}
разумеется код не идеальный так для изучения
0
aLarman
646 / 567 / 164
Регистрация: 13.12.2012
Сообщений: 2,123
Завершенные тесты: 2
25.03.2014, 12:17 3
Цитата Сообщение от BonaBerry Посмотреть сообщение
старший байт числа равен значению переменной с.
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
int tmp1=i&0x00FFFFFF; // удаляем старший байт
зачем его обнулять? его как раз надо оставить, а остальное убрать. и затем сравнить то что осталось с tmp
0
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,940
25.03.2014, 12:27 4
Цитата Сообщение от aLarman Посмотреть сообщение
зачем его обнулять? его как раз надо оставить, а остальное убрать. и затем сравнить то что осталось с tmp
ну может и так
я же сказал
Цитата Сообщение от ValeryS Посмотреть сообщение
если я правильно перевел
вот другой вариант

C++
1
2
3
4
5
6
7
8
for(int i=min; i<=max; i++)
{
 int tmp=c<<24;// создаем переменный в которой старший байт равен c
 int tmp1=i&0xFF000000 //удаляем все кроме старшего байта
 if(tmp1== tmp)  // сравниваем
   q++;
 
}
или вот так
C++
1
2
3
4
5
6
7
8
for(int i=min; i<=max; i++)
{
 int tmp=(i>>24)&0xFF;//выделяем старший байт
 
 if(tmp1== c)  // сравниваем
   q++;
 
}
0
BonaBerry
3 / 3 / 0
Регистрация: 21.09.2013
Сообщений: 73
25.03.2014, 13:23  [ТС] 5
Ребят, спасибо большое.
Такой вопрос, что аж неловко, чего я не понимаю про маски и представления чисел, так это вот что -
как из такого числа 0x00FFFF00 (тип int - 8 битов) получается такое:
00000000 11111111 111111111 000000000 (тот же тип int, тоже число в 32 разрядной сетке ). Как так оно "растянулось"?
и как при помощи маски 0x.....
мне допустим воссоздать такое представление числа?
00110101 111100010 111011001 111100011
0
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,940
25.03.2014, 13:35 6
Цитата Сообщение от BonaBerry Посмотреть сообщение
Как из такого числа 0x00FFFF00 получается такое:
00000000 11111111 111111111 000000000
нук
таблица перевода из двоичного в шестнадцатеричное
0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 8 8
1001 9 9
1010 A 10
1011 B 11
1100 C 12
1101 D 13
1110 E 14
1111 F 15

эта таблица на 4 бита(полубайт) в байте 8 бит значит делишь в блоки по 4 и заменяешь буквами/цифрами
например 10000000 1000 0000 80(шеснадцетиричных) в Си записывается так 0x80
11111111 1111 1111 0xFF
01010101 0101 0101 0x55

выучи пригодится

Добавлено через 35 секунд
Цитата Сообщение от BonaBerry Посмотреть сообщение
мне допустим воссоздать такое представление числа?
00110101 111100010 111011001 111100011
попробуй сам

Добавлено через 2 минуты
Цитата Сообщение от BonaBerry Посмотреть сообщение
и как при помощи маски 0x.....
это не маска это представление числа
в Си 3 представления
123 десятичное
0123 восьмеричное, начинается с 0
0х123 шестнадцатеричное, начинается с 0х
0
BonaBerry
3 / 3 / 0
Регистрация: 21.09.2013
Сообщений: 73
25.03.2014, 14:00  [ТС] 7
ValeryS, прям развеял мои думы))) Теперь только сама попробую))
Что меня вводило в заблуждение, что видела представление "-1" как 0xffffffff а не 0xffffffffffff......
а чего же двоичного нет??? если это можно сказать фундамент программирования и исчисления.
0
aLarman
646 / 567 / 164
Регистрация: 13.12.2012
Сообщений: 2,123
Завершенные тесты: 2
25.03.2014, 14:08 8
-1 может разной быть
например int то 0xFFFFFFFF
short int 0xFFFF
char 0xFF
тут главное сколько байт в представлении числа (4 2 1 в примере)
0
BonaBerry
3 / 3 / 0
Регистрация: 21.09.2013
Сообщений: 73
25.03.2014, 14:08  [ТС] 9
0011 0101 1111 0010 1110 1001 1111 0011 = 0x35f2e9f3
Хотя я понимаю, что могу воспользоваться калькулятором программиста, но хочется дойти до сути...
0
aLarman
646 / 567 / 164
Регистрация: 13.12.2012
Сообщений: 2,123
Завершенные тесты: 2
25.03.2014, 14:11 10
Цитата Сообщение от BonaBerry Посмотреть сообщение
а чего же двоичного нет???
я думаю потому что это неудобно, сами подумайте для int используется 32 бита, и что их все перечислять?

Добавлено через 1 минуту
Цитата Сообщение от BonaBerry Посмотреть сообщение
но хочется дойти до сути...
все таки спрошу, в школе информатика была?
0
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,940
25.03.2014, 14:13 11
Лучший ответ Сообщение было отмечено BonaBerry как решение

Решение

Цитата Сообщение от BonaBerry Посмотреть сообщение
а чего же двоичного нет??? если это можно сказать фундамент программирования и исчисления.
к отцам основателям вопросы
Цитата Сообщение от BonaBerry Посмотреть сообщение
что видела представление "-1" как 0xffffffff а не 0xffffffffffff......
а это от размерности зависит
например char (8 бит) 0xFF
short (16 бит) 0xFFFF
int (32 бит) 0xFFFFFFFF
long long (64 бит) 0xFFFFFFFFFFFFFFFF

Добавлено через 1 минуту
Цитата Сообщение от BonaBerry Посмотреть сообщение
0011 0101 1111 0010 1110 1001 1111 0011 = 0x35f2e9f3
Браво
Цитата Сообщение от BonaBerry Посмотреть сообщение
Хотя я понимаю, что могу воспользоваться калькулятором программиста,
а это для проверки
1
BonaBerry
3 / 3 / 0
Регистрация: 21.09.2013
Сообщений: 73
25.03.2014, 14:42  [ТС] 12
В школе информатика была, но мы там по большей части работали в Exel и Power Point.
Про двоичную систему возник вопрос и ее "явное "отсутствие в С++ мне удивило по большей части, во-первых, из-за обилия ее в "Архитектуре.. '' и явный пресинг на представления двоичных чисел и побитовые операции еже с ними , что вот и казалось что двоичная система- это наше всё. Нет, всё - это 16ричная! Все смешалось и вылетело из головы.
Теперь все куда как понятнее. Сейчас порешаю задачки и вынесу их на всеобщие обозрение.
0
aLarman
646 / 567 / 164
Регистрация: 13.12.2012
Сообщений: 2,123
Завершенные тесты: 2
25.03.2014, 14:49 13
Цитата Сообщение от BonaBerry Посмотреть сообщение
но мы там по большей части работали в Exel и Power Point.
странно, у меня была только в 10 и 11 там мы прогали на паскале ну и с числами работали(нам рассказывали про представление чисел и перевод из одной системы счисления в другую)
0
BonaBerry
3 / 3 / 0
Регистрация: 21.09.2013
Сообщений: 73
25.03.2014, 16:09  [ТС] 14
aLarman вот как- то так. Я думаю опыт программирования на Паскаль, мне бы сейчас здорово бы помог.


Вот код для второго задания, в котором нужно инвертировать серединку. Получается в два шага.
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
{
             int i=sizeof(int);
             int vid, vid2, vid3;
             
             int y=0x7fff007A;
            
            cout <<"y = " << y <<endl; 
            
            for (int i=31; i>=0; i--)  // цикл перебора значений
                {   
                    vid=((y>>i)&1);    
                    cout <<vid;
                }
                    cout << endl;
 
 
            int z= y & 0x7f00ff7A; 
            cout <<"z = " <<z<<endl; 
 
            for (int i2=31; i2>=0; i2--)  // цикл перебора значений
                {   
                    vid2=((z>>i2)&1);    
                    cout <<vid2;
                }
                    cout << endl;
 
 
            int w= z | 0x7f00ff7A; 
            cout <<"w = " <<w<<endl; 
 
            for (int i3=31; i3>=0; i3--)  // цикл перебора значений
                {   
                    vid3=((w>>i3)&1);    
                    cout <<vid3;
                }
                    cout << endl;
0
aLarman
646 / 567 / 164
Регистрация: 13.12.2012
Сообщений: 2,123
Завершенные тесты: 2
25.03.2014, 16:38 15
у Вас получилась привязка к конкретным значениям, а не общее решение, стоит изменить иисх данные -все сломается

Добавлено через 2 минуты
Цитата Сообщение от BonaBerry Посмотреть сообщение
превратить в такое, т.е. середику проинвертировать
я правильно понимаю задание, взять 3ий байт и поменять его с 2ым
0
BonaBerry
3 / 3 / 0
Регистрация: 21.09.2013
Сообщений: 73
25.03.2014, 16:46  [ТС] 16
1. Дана переменная int x = …; Проинвертируйте в этой переменной значения битов двух средних байтов, например:
bla-bla-111111111-000000000-bla-bla
не изм-000000000-111111111-не изм.


Что-то да я не подумала, что число может с консоли вводится.
0
aLarman
646 / 567 / 164
Регистрация: 13.12.2012
Сообщений: 2,123
Завершенные тесты: 2
25.03.2014, 16:46 17
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
int main(int argc, char* argv[])
{
    
        int i=sizeof(int);
        int vid, vid2, vid3;
 
        int y=0x7fff007A;// вот тут стоит организовать ввод числа у а не зашить его в проге
 
        cout <<"y = " << y <<endl;
 
        for (int i=31; i>=0; i--) // цикл перебора значений
        {
            vid=((y>>i)&1);
            cout <<vid;
        }
        cout << endl;
 
 
        int z= y & 0x0000FF00; //z это 2ой байт
        cout <<"z1 = " <<z<<endl;
 
        for (int i2=31; i2>=0; i2--) // цикл перебора значений
        {
            vid2=((z>>i2)&1);
            cout <<vid2;
        }
        cout << endl;
 
        int z2= y & 0x00FF0000;//z2 это 3ий байт
        cout <<"z2 = " <<z2<<endl;
        for (int i2=31; i2>=0; i2--) // цикл перебора значений
        {
            vid2=((z2>>i2)&1);
            cout <<vid2;
        }
        cout << endl;
 
 
        int w= (y&0xFF0000FF)|(z<<8)|(z2>>8);// берем 4 и 1ый байт (y&0xFF0000FF) добавляем 2ой байт на место 3его (z<<8) добавляем 3ий байт на место 2го (z2>>8)
        cout <<"w = " <<w<<endl;
 
        for (int i3=31; i3>=0; i3--) // цикл перебора значений
        {
            vid3=((w>>i3)&1);
            cout <<vid3;
        }
        cout << endl;
    system("pause");
    return 0;
}
1
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,940
25.03.2014, 17:04 18
Цитата Сообщение от BonaBerry Посмотреть сообщение
ана переменная int x = …; Проинвертируйте в этой переменной значения битов двух средних байтов, например:
я же показал
Цитата Сообщение от ValeryS Посмотреть сообщение
a^=0x00FFFF00;
исключающие ИЛИ(^) с 1 даст инверсию бита
смотри

0 0 0
0 1 1
1 0 1
1 1 0
1
aLarman
646 / 567 / 164
Регистрация: 13.12.2012
Сообщений: 2,123
Завершенные тесты: 2
25.03.2014, 17:11 19
Цитата Сообщение от ValeryS Посмотреть сообщение
исключающие ИЛИ(^) с 1 даст инверсию бита
там вроде поменять местами байты...или я не совсем понял
0
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,940
25.03.2014, 17:17 20
Цитата Сообщение от aLarman Посмотреть сообщение
там вроде поменять местами байты...
ага
Цитата Сообщение от BonaBerry Посмотреть сообщение
Проинвертируйте в этой переменной значения битов двух средних байтов,
а перемешенные просто показалось, из за исходных данных
Цитата Сообщение от BonaBerry Посмотреть сообщение
111111111-000000000
проинвертируй, и кажется что они моменялись
0
25.03.2014, 17:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2014, 17:17

Определить, что куб суммы цифр числа равен А*А
Пользователь вводит целое число А. Программа должна определить, что куб суммы...

Определить номера строк матрицы, хотя бы один элемент которых равен заданному значению
4. Определить номера строк матрицы R, хотя бы один элемент которых равен с, и...

Определить номера строк матрицы, в которых хотя бы один элемент равен заданному значению
Определить номер строки матрицы R,хотя бы один элемент которых равен С, и...


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

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

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