Хорошо, при условии, что ASCII, который ни в коем случае не гарантирован, pData[0]
равен 'a'
(0x61
) и pData[1]
равен 'b'
(0x62
):
pDes[1]:
pData[0] 0110 0001
&0x1c 0001 1100
---- ----
0000 0000
>>2 0000 0000 0x00
pDes[0]:
pData[0] 0110 0001
<< 6 01 1000 0100 0000 (interim value *a)
pData[1] 0110 0010
&0x3f 0011 1111
-- ---- ---- ----
0010 0010
|(*a) 01 1000 0100 0000
-- ---- ---- ----
01 1000 0110 0010 0x1862
Как это работает:
<< N
просто означает смещение битов N
пробелов влево, >> N
то же самое, но смещение вправо.
Операция &
(and
) устанавливает каждый бит результата в 1, если и только если соответствующий бит на обоих входах равен 1.
Операции |
(or
) устанавливают каждый бит результата равным 1, если один или несколько соответствующих битов на обоих входах равны 1.
Обратите внимание, что 0x1862 будет усечено до размера pDes[0]
, если его тип недостаточно широк.
Следующая программа C показывает это в действии:
#include <stdio.h>
int main(void) {
char *pData = "abc";
int pDes[2];
pDes[1] = ( pData[0] & 0x1c ) >> 2;
pDes[0] = ( pData[0] << 6 ) | ( pData[1] & 0x3f );
printf ("%08x %08x\n", pDes[0], pDes[1]);
return 0;
}
Выводит:
00001862 00000000
и, когда вы меняете pDes
на массив символов, вы получаете:
00000062 00000000