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

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

Войти
Регистрация
Восстановить пароль
 
 
Zla9_Kolu4ka
2 / 2 / 0
Регистрация: 28.08.2013
Сообщений: 409
#1

Как работает функция "test" в приведенном коде - C++

14.01.2014, 16:14. Просмотров 919. Ответов 27
Метки нет (Все метки)

Объясните как работает функция test

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
#include <conio.h>
#include <iostream.h>
#include <limits.h>
 
int     test(long int a)
     {return ((a>>15)+1)&~1;}
 
int     primC(int a, const int b, const int c, const int d)
{ double z = (2.0*a+1.0*b*c)/(d-a);  //!!!!!!!!!! ВНИМАНИЕ !!!!!!!!!!!!!!!!!
  if (z > SHRT_MIN && z < SHRT_MAX) return z;
   else
    { cout << "\n!!!!!!!!!!! Limits of int value !!!!!!!!!!!\n  x = "
           << z << endl;
      return SHRT_MIN; //-32768
     }
 }
 
int X,a;
 
void main(void)
{   char ch;
    const b=-333;
    const c= 1000;
    const d=-10;
    long int a1;
    do {X = 0;
        cout << "\n    x=(2*a+b*c)/(d-a);  int x,a,b=-333,c=1000,d=-10;" << endl;
        do{ cout<<"\n    Enter a [-32768..32767], a!= " << d << " ====> ";
            cin>> a1;
           }while (test(a1) || d - a1 == 0 || test (d-a1));
        a = a1;
        X = primC(a, b, c, d);
        if (X!=SHRT_MIN)
         { cout << " Result (C++) x = " << X << endl;
          }
        cout << "\n\nExit? - (y/n)\n";
        ch = getch();
       } while (!(ch=='y' || ch =='Y'));
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2014, 16:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как работает функция "test" в приведенном коде (C++):

Патерн "прототип" не работает, выдаёт ошибку "недопустимый вызов нестатической ф-ции", где я в коде ошибка? - C++
Вот мой код... #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;vector&gt; #define vrom vector&lt;room&gt; using namespace std; ...

Почему не работает функция std::regex_replace(temp,"amp;",""); - C++
Пробую вызывать функцию std::regex_replace(temp,&quot;amp;&quot;,&quot;&quot;); Пишет ошибку: test_ok_ruDlg.cpp 1&gt;d:\visual studio...

Как работает генерация случайных чисел в приведенном коде - C++
Дорогие Форумчане! Подскажите пожалуйста, как работает нижеследующий код для генерации случайных чисел: random=rand()%(b+1-a)+a; ...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в "код операции"; обнаружено "SHL" - C++
visual studio выдал такую ошибку error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в &quot;код операции&quot;; обнаружено...

Не работает функция подсчета количеств букв "а" в словах - C++
Подскажите пожалуйста почему не работает функция подсчета количеств букв &quot;а&quot; в словах. Ничего не выводит. #include &lt;iostream&gt; #include...

27
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,246
15.01.2014, 01:47 #16
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
{return ((a>>15)+1)&~1;}
C++
1
2
3
4
5
6
a=a/32768;
a++;
a=a&0xFFFFFFFE;// обнуляет младший разряд приводит к меньшему четному
//вместо этого можно было написать
//if(a%2!=0)
// a--;
так понятней?

Добавлено через 1 минуту
Цитата Сообщение от MrGluck Посмотреть сообщение
До всегда будет выдавать 0
только для положительных
для всех отрицательных не будет 0

Добавлено через 1 минуту
есть подозрение что это проверка на отрицательность числа
только написано было давно когда инт был 16 битным
0
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,633
15.01.2014, 01:50 #17
Цитата Сообщение от ValeryS Посмотреть сообщение
для всех отрицательных не будет 0
для отрицательных манипуляции далее (инкремент и &~1) в 0 изменят.
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,246
15.01.2014, 01:59 #18
Цитата Сообщение от MrGluck Посмотреть сообщение
для отрицательных манипуляции далее (инкремент и &~1) в 0 изменят.
да насчет всех я погорячился
ну вот число
-2147483648(0х80000000) надеюсь о 32 разрядных говорим
сдвиг
получаем 0хFFFF0000
инкремент 0хFFFF0001
&0xFFFFFFFE
=
0хFFFF0000
получается что это диапазон чисел
от 0 до 215
и малых отрицательных( больших по модулю)
только зачем это ума не приложу
0
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,633
15.01.2014, 02:03 #19
ValeryS, все верно, но если тип занимает не более 2 байт. Я присоединяюсь к
Цитата Сообщение от HighPredator Посмотреть сообщение
Вот глядя на все это у меня возникла мысль, что код рассчитан изначально не на long int, а на short int.
0
Zla9_Kolu4ka
2 / 2 / 0
Регистрация: 28.08.2013
Сообщений: 409
15.01.2014, 02:03  [ТС] #20
-2147483648(0х80000000) надеюсь о 32 разрядных говорим
Этот код под 16 бит, а не 32
0
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,633
15.01.2014, 02:08 #21
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
Этот код под 16 бит, а не 32
По стандарту, ничто не гарантирует, что int или short int и т.д. (не считая char и unsigned char) занимает какое-то определенное кол-во памяти.
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,246
15.01.2014, 02:31 #22
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
Этот код под 16 бит, а не 32
а где это было указано?
теперь смотрим
максимальное положительное число для 2 байт
32767 0х7FFF
>>15=0
(0+1)&0xFFFE=0
минимальное отрицательное
-32768 0x8000
>>15=0xFFFF
0xFFFF+1=0 &0xFFFE=0
в результате функция всегда возвращает 0

единственно что я могу предположить что функция возвращает не 0 если число отрицательное
но тогда в прототипе должно быть
C++
1
int     test(unsigned long int a)
тогда
0x8000
>>15=0x0001
0x0001+1=2 &0xFFFE=2
0
Zla9_Kolu4ka
2 / 2 / 0
Регистрация: 28.08.2013
Сообщений: 409
15.01.2014, 02:41  [ТС] #23
а где это было указано?
Тут по коду понятно
C++
1
2
int     primC(int a, const int b, const int c, const int d)
      return SHRT_MIN; //-32768
int 16-ти битное
0
ValeryS
15.01.2014, 02:44
  #24

Не по теме:

Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
Тут по коду понятно
да по этому коду, много что понятно

0
Zla9_Kolu4ka
2 / 2 / 0
Регистрация: 28.08.2013
Сообщений: 409
15.01.2014, 19:30  [ТС] #25
минимальное отрицательное
-32768 0x8000
>>15=0xFFFF
Не пойму, почему тут 0xFFFF, а не 0x0001
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,246
15.01.2014, 19:54 #26
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
Не пойму, почему тут 0xFFFF, а не 0x0001
потому что сдвиг вправо отличается для знаковых и беззнаковых типов
при сдвиге беззнаковых в левый разряд записывается 0
а при сдвиге знаковых в левый разряд записывается копия знакового бита(левого разряда)
так при сдвиге безнаковых
0x8000(1000 0000 0000 0000)>>1=0x4000(0100 0000 0000 0000)
а так при сдвиге знаковых
0x8000(1000 0000 0000 0000)>>1=0xC000(1100 0000 0000 0000)
чтобы было понятней
-32768(0x8000)/2=-16384(0xC000)
32768(0x8000)/2=16384(0x4000)
1
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
15.01.2014, 19:58 #27
Цитата Сообщение от MrGluck Посмотреть сообщение
Элементарно:
здесь её нет
читай:
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
int * * test(long int a)
* * *{return ((a>>15)+1)&~1;}
.
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
Объясните как работает функция test
А прочитать ни как? Всего то сдвиг параметра на 15 бит, потом арифметическое сложение результата с единицей, к сумме побитно применяется И c числом, все биты которого противоположны битам единицы в разрядности long int.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,633
15.01.2014, 21:42 #28
Цитата Сообщение от taras atavin Посмотреть сообщение
читай:
читай
Цитата Сообщение от MrGluck Посмотреть сообщение
wolf1396, ТС изначально скинула файл на форум, где функция test называлась по другому. Когда я сделал замечание - она исправила код (можно в течении 5 минут после публикации) и зачем то (!!!) еще и написала мне что мол я просто так придираюсь. А я, как писал уже выше, даже через поиск Ctrl + F проверил наличие сией функции.
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
просто я когда написала код, смотрю, имя функции не test, а temp и подправила и даже не предала этому значения вообще, потому что temp функция была где то секунд 30
0
15.01.2014, 21:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2014, 21:42
Привет! Вот еще темы с ответами:

Структура "Штраф". Функция поиска криво работает - C++
Не работает функция poisk(); Переписать в новый файл информацию о штрафах, размер которого и дата вводятся с клавиатуры. ...

Не работает функция itoa(): "was not declared in this scope" - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; в ошибке написано что itoa() не объявлена (itoa()...

В заданном двоичном коде заменить все цифры "0" на "1" и наоборот - C++
составить алгоритм который в заданном двоичном коде заменяет все цифры &quot;0&quot; на &quot;1&quot; и наоборот

Не работает функция system("dir") - C++
Уже не знаю сколько с этим мучаюсь, но оставлять просто так не охотно. Ни в какую не работает функция System. Пришлось заменять, но все же...


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

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

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