Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тех прог.doc
Скачиваний:
38
Добавлен:
14.11.2019
Размер:
3.59 Mб
Скачать

13.4.Двоичный код с избытком

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

Здесь битовые комбинации и соответствующие им числа расположены по возрастанию, нуль занимает центральное положение. Если рассматривать битовые комбинации просто как двоичные числа, то для получения соответствующего числового значения нужно из двоичного числа вычесть 128. Можно сказать и по-другому: числа хранятся в виде, увеличенном на 128, отсюда и происходит название данного представления: код с избытком.

Двоичная нотация с избытком применяется для хранения порядка чисел с плавающей точкой.

Таблица 51. Код с избытком 128

Битовая комбинация

Числовое значение

1111 1111

127

1111 1110

126

1000 0011

3

1000 0010

2

1000 0001

1

1000 0000

0

0111 1111

–1

0111 1110

–2

0111 1101

–3

0000 0001

–127

0000 0000

–128

13.5.Побитовые операторы

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

| – побитовое логическое ИЛИ,

& – побитовое логическое И,

^ – побитовое исключающее ИЛИ,

~ – побитовое логическое отрицание,

<< – сдвиг влево,

>> – сдвиг вправо.

В табл.52 представлены результаты выполнения побитовых операторов над двумя битами a и b.

Таблица 53. Таблица истинности побитовых логических операторов

a

b

a|b

a&b

a^b

~a

1

1

1

1

0

0

0

1

1

0

1

1

1

0

1

0

1

0

0

0

0

0

0

1

Оператор побитового ИЛИ можно использовать для установки в 1 заданных разрядов числа, например, после выполнения инструкции

y = x | 017;

четыре младших разряда y будут равны 1. Действительно, пусть x, y занимают 1 байт памяти и x имеет исходное значение

x7x6x5x4 x3x2x1x0,

тогда

x:

|

x7

x6

x5

x4

x3

x2

x1

x0

017:

0

0

0

0

1

1

1

1

y=

x7

x6

x5

x4

1

1

1

1

Оператор побитового И можно использовать для установки в 0 заданных разрядов числа, например, после выполнения инструкции

y = x & 017;

четыре старших разряда y будут нулями, а младшие разряды не изменятся. Пусть, например, x имеет исходное значение:

x7x6x5x4 x3x2x1x0,

тогда

x:

&

x7

x6

x5

x4

x3

x2

x1

x0

017:

0

0

0

0

1

1

1

1

y=

0

0

0

0

x3

x2

x1

x0

Оператор побитового исключающего ИЛИ можно использовать для изменения заданных разрядов на противоположные. Например, пусть переменная x имеет исходное значение:

1100 0101.

Найдем его значение после выполнения инструкции:

x = x ^ 017;

x:

^

1

1

0

0

0

1

0

1

017:

0

0

0

0

1

1

1

1

x=x^017:

1

1

0

0

1

0

1

0

Видно, что младшие разряды x приняли противоположное значение, а старшие не изменились.

Оператор ~ инвертирует (меняет на противоположные) все биты операнда. Пусть, например, x имеет код:

1100 0101.

После выполнения инструкции y = ~x; двоичный код для y будет:

0011 1010.

Операторы << и >> сдвигают свои первые операнды соответственно влево и вправо на число позиций, заданных вторым операндом. Значение второго операнда этих операторов должно быть неотрицательным.

Так,

y << 2

сдвигает значение y влево на 2 разряда, заполняя освобождающиеся разряды нулями, что, кстати, эквивалентно умножению на 4. Если y имеет тип char и двоичное представление

1100 01012 = –0011 10112 = –5910,

то выражение y << 2 имеет значение:

1100 0101 << 2 = 0001 01002 = 2010.

Умножим теперь -59 на 4, что эквивалентно четырехкратному сложению:

+

+

+

1

1

0

0

0

1

0

1

1

1

0

0

0

1

0

1

1

1

0

0

0

1

0

1

1

1

0

0

0

1

0

1

0

0

0

1

0

1

0

0

Как видим, результат одинаков.

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

При сдвиге вправо знаковой величины происходит «размножение» знака, благодаря чему отрицательное число остается отрицательным после сдвига, а положительное – положительным

Сдвиг вправо на один разряд эквивалентен делению числа на 2. Пусть y имеет рассмотренное выше значение

1100 01012 = -5910.

Значение выражения y >> 2 равно

(1100 0101 >> 2) = 111100 012 = -0000 11112 = -15.

Это эквивалентно делению на 4 с отбрасыванием остатка.