Программирование >>  Элементы языков с и с++ 

1 ... 29 30 31 [ 32 ] 33 34 35 ... 200


Листинг 6.3

19.срр : Defines the entry point for the console application.

include stdafx.h

♦include <stdio.h> for getchar(),putchar()

♦include <conio.h>

-Проверка побитовых логических операций-----------

- Функция подсчета количества битов в целом числе-

int bitcount (unsigned int n) (

int b;

for(b=0,- n != 0; n =l) if (n & 01) 01 - восьмеричная единица

b++; return (b);

-----------------------------------------------------

int tmain 0 (

int n=017; восьмеричное число (4 единицы) printf( The units quantity in n=%d\n ,bitcount(n)); getch();

-----------------------------------------------------

Результат работы этой программы показан на рис. 6.1.

с* C:\WlNDOWS\system32\cmd.exe

Die units quantity in n=4

Для продолжения нажмите любую клавишу



Суть алгоритма функции bitcount () состоит в следующем: в цикле, который идет по переменной цикла ь, целое число п сравнивается с восьмеричной единицей (она же - двоичная единица) с помощью операции & (и). Так как число 01 можно представить и как, например, oooooooi, то, учитывая, как работает операция можно сказать, что результатом вычисления выражения (п & 01) будет значение последнего бита числа п.

Действительно:

□ если в последнем бите числа п - нуль, то выражение (п & 01) даст тоже нуль;

□ если - единица, то (п & oi) даст единицу.

Следовательно, выражение (п & 01) просматривает все биты числа п. То есть в теле оператора, содержащего это выражение, можно подсчитывать, сколько раз выражение (п & 01) было равно единице (что на самом деле означает, сколько единиц содержит число п). Просмотр содержимого числа п происходит за счет сдвига его содержимого вправо на один бит в каждом цикле.

Мы видели, что выражение n =i равносильно выражению п=п 1 (т.е. сдвинуть содержимое переменной п на один разряд вправо и результат записать в п ). Поэтому действие будет происходить так: сначала в заголовочной части оператора for вычисляется значение переменной цикла ь, которая получает значение нуль. Затем там же, в заголовочной части for, вычисляется выражение, определяющее условие продолжения/завершения цикла (п !=0}. Следовательно, значение переменной, в которой мы накапливаем единицы, должно быть ненулевым.

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

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

Если же число отрицательное, то в его знаковом разряде будет единица, и ею станут заполняться освобождающиеся при сдвиге биты. Вот этого-то нам как раз и не надо! Чтобы избежать такой неприятности, следует сдвигаемое вправо число объявить с атрибутом unsigned (у нас так и объявлена переменная п).



Условное выражение

Это конструкция вида: el ? е2 : еЗ, гдее1, е2, еЗ - некоторые выражения. Читается эта конструкция так: Если el отлично от нуля (т. е. истинно), то значением этой конструкции будет значение выражения е2, иначе - еЗ .

Пользуясь условным выражением, можно упрощать некоторые операторы. Например, вместо того, чтобы писать:

if(a<b) z=a; else z=b; можно записать:

z=(a>b) ? а : b;.

Эти выражения как обычные выражения можно помещать в качестве аргументов функции printf о ИТ. д.

Операторы и блоки

Если за любым выражением (например, х=о, i++ или printf (...)) стоит точка с запятой, то такое выражение в языке С называется оператором.

Таким образом:

О х=0;-оператор;

П i++;-оператор;

П printf(...); - оператор.

Фигурные скобки {} служат для объединения операторов в блоки. Такой блок синтаксически эквивалентен одному оператору, но точка с запятой после блока не ставится (компилятор определяет конец блока по его закрывающей скобке).

Исходя из этого определения, можно записать формат задания операторов for, while, if таким образом:

for (выражение) while(выражение) i f(выражение) блок блок блок

Если в блоке всего один оператор, то фигурные скобки можно опустить.

В этом случае освобождающиеся от сдвига вправо разряды станут заполняться не знаковым разрядом, а нулем. Такой сдвиг называют логическим.



1 ... 29 30 31 [ 32 ] 33 34 35 ... 200

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика