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

Сдвиг битов влево

Используйте оператор сдвига влево (<<) для выполнения сдвига битов влево на нуль или другое число позиций. Оператор

С = А << 3;

присваивает переменной С значение переменной А, сдвинутое на три бита влево.

Листинг 2.7 отображает результат поразрядного сдвига влево, примененного к двум 16-битовым беззнако­вым значениям. Скомпилируйте и запустите эту программу, затем введите два числа - 89 и 3 (разделенные пробелом), и вы увидите результат сдвига числа 89 на 3 бита влево.

Листинг 2.7. TLEFT.C (поразрядный сдвиг влево)

1: #include <stdio.h>

2: #include "pbin.c"

3:

4: main()

5: {

6: unsigned v1, v2, v3;

7:

8: printf("Enter values to SHIFT LEFT: (ex: 1234 3) ");

9: scanf("%u %u", &v1, &v2);

10: v3 = v1 << v2;

11: printf(" %5u %#06x ", v1, v1); pbin(v1);

12: printf("<< %5u %#06x ", v2, v2); pbin(v2);

13: printf("===========================^========\n");

14: printf(" %5u %#06x ", v3, v3); pbin(v3);

15: return 0;

16: }

______________________________________________

В двоичном представлении сдвиг битов на одну позицию влево эквивалентен умножению исходного значения на 2, т.е. на основание двоичной системы счисления. То же самое справедливо и для значений, записанных в других системах счисления. Например, сдвиг цифр в десятичном числе 1234 влево на одну позицию и внесение нуля справа даст в результате число 12340, которое в 10 раз больше исходного числа по основанию 10. Но в язы­ке С все сдвиги выполняются в двоичном формате.

Поскольку двоичные компьютеры выполняют сдвиг влево очень быстро, то операции поразрядного сдвига влево являются быстрым способом умножения чисел на степень числа два. Убедитесь в этом, используя про­грамму TLEFT. Запустите программу, введите через пробел числа 4 и 1, и вы должны увидеть следующее:

4 0х0004 0000000000000100

<< 1 0х0001 0000000000000001

8 0х0008 0000000000001000

Сдвиг числа 4 влево на один разряд дает в результате 8, что, конечно же, равно произведению 4 на 2.

Рис.2.4 иллюстрирует действие оператора С = А << В; , где А равно двоичному значению 01011001, а В равно 3. Как видно по результату (С), освобождающиеся справа позиции заполняются нулями, в то время как двигаемые влево старшие биты теряются (что иллюстрируется на рисунке символом электрического заземления), а сами разряды "исчезают в земле" подобно электронам.

Рис. 2.4. Действие оператора поразрядного сдвига влево

Сдвиг битов вправо

Как вы могли догадаться, опера­тор поразрядного сдвига вправо ра­ботает аналогично оператору сдвига влево, но сдвигает биты в другом направлении. Оператор

С = А >> 3;

присваивает переменной С значение переменной А, сдвинутое на три би­та вправо.

Листинг 2.8 отображает результат оператора поразрядного сдвига вправо, примененного к двум 16-битовым беззнаковым значениям. Скомпили­руйте и запустите эту программу, затем введите два числа 89 и 3 (разделенные пробелом), и вы увидите резуль­тат сдвига числа - 89 на 3 бита вправо.

Листинг 2.8. TRIGHT.C (поразрядный сдвиг вправо)

______________________________________________

1: #include <stdio.h>

2: #include "pbin.c"

3:

4: main()

5: {

6: unsigned v1, v2, v3;

7:

8: printf("Enter values to SHIFT RIGHT: (ex: 1234 3) ");

9: scanf("%u %u", &v1, &v2);

10: v3 = v1 >> v2;

11: printf(" %5u %#06x ", v1, v1); pbin(v1);

12: printf(">> %5u %#06x ", v2, v2); pbin(v2);

13: printf("====================================\n");

14: printf(" %5u %#06x ",v3, v3); pbin(v3);

15: return 0;

16: }

_______________________________________________________

Если операции сдвига влево умножают числа на 2, то операции сдвига вправо выполняют деление чисел. Аналогичное утверждение справедливо для основания любой системы счисления. Сдвиг числа 12340 вправо на одну цифру и отбрасывание нуля даст число 1234, которое мы получили бы при делении исходного числа на основание 10. Но в языке С все сдвиги выполняются в двоичном формате.

Чтобы увидеть, как сдвиг двоичных чисел вправо выполняет деление на 2, запустите программу TRIGHT, введите 89 и 3 и рассмотрите результат работы программы:

89 0х0059 0000000001011001

>> 3 0х0003 0000000000000011

==========================

11 0x000b 0000000000001011

По законам целочислен­ной арифметики деление числа 89 на 2 в степени 3 (т.е. 8) даст в результате 11.

Рис. 2.5 иллюстрирует действие оператора

С = А >> В;

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

Рис. 2.5. Действие оператора поразрядного сдвига вправо

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]