Задачи по языку С

       

являются восьмеричными числами. Восьмеричное представление


вначале x = 03, y = 02, z = 01
x | y & z Целые константы, начинающиеся с цифры 0 (нуль), являются восьмеричными числами. Восьмеричное представление целых чисел особенно удобно, когда приходится работать с поразрядными операциями, так как восьмеричные цифры легко переводятся в двоичные. В этой задаче числа 01, 02, 03 соответствуют числам 1, 2, 3, так что появление восьмеричных чисел служит намеком читателю, что программа рассматривает значения x, y и z как последовательности двоичных цифр.
(x|(y&z)) Вследствие приоритетов операций.
(x|(02&01)) Самое внутреннее выражение вычисляется первым.
0|x В двоичном представлении: 01=1, 02=10, 03=11

10 & 01 ---- 00
(03|0)
03



00 | 11 ---- 11


вначале x = 03, y = 02, z = 01 x | y & ~ z (x|(y&(~z)))
(x|(y&~01)) Операция ~ меняет каждый разряд своего операнда на противоположный, так что 0...01 становится 1...10.
(x|(02&~01))
(03|02) В двоичном представлении:

0...010 & 1...110 --------- 0...010
3 10 | 11 ---- 11


вначале x = 03, y = 02, z = 01 x ^ y & ~ z
(x^(y&(~z))) Здесь выражение похоже на предыдущее, только операция включающего ИЛИ (|) заменив на операцию исключающего ИЛИ (^).
(x^(02&~01))
(03^02) 1 В двоичном представлении:

10 ^ 11 ---- 01


вначале x = 03, y = 02, z = 01 x & y && z ((x&y)&&z) ((03&02)&&z) (02&&z) (TRUE&&z) (TRUE&&01) (TRUE&&TRUE)
TRUE или 1 Операция && дает результат ИСТИНА, когда оба операнда имеют значение ИСТИНА


вначале x = 01 ! x | x ((!x)|x) ((!TRUE)|x) (FALSE|01) (0|01) 1



вначале x = 01 ~ x | x ((~x)|x) (~01|01)
1 В двоичном представлении:

1...110 | 0...001 --------- 1...111 или -1


вначале x = 01 x ^ x (01^01)
0 В двоичном представлении:

0...01 ^ 0...01 -------- 0...00

(Ответ будет одним и тем же для всех значений x.)


вначале x = 01 x <<= 3 x=01<<3
x=8 В двоичном представлении:

0000...01 << 3 --------- 0...01000, что равно 8

Каждый сдвиг влево на 1 разряд равнозначен умножению на 2.


вначале y = -01 y <<= 3 y=-01<<3
y=-8 В двоичном представлении:

1111...11 << 3 --------- 1...11111, или -8


вначале y = -08 y>>=3 y=-08>>3

В этот момент появляется искушение сказать, что y=-1. К сожалению, это будет не всегда так, поскольку на некоторых машинах при операциях сдвига знак числа может не сохраниться. Язык С не гарантирует, что операция сдвига арифметически корректна, поэтому в любом случае более ясным способом деления на 8 было бы явное деление: y=y/8.


Содержание раздела