> 2; pDes[0] = ( pData[0] >2 -6ren">
gpt4 book ai didi

c++ - 关于按位 And 和 Shift 运算的问题

转载 作者:行者123 更新时间:2023-11-30 00:41:39 25 4
gpt4 key购买 nike

如果 pData = "abc",下面几行是如何工作的?

pDes[1] = ( pData[0] & 0x1c ) >> 2;
pDes[0] = ( pData[0] << 6 ) | ( pData[1] & 0x3f );

最佳答案

好吧,假设 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

关于c++ - 关于按位 And 和 Shift 运算的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3243892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com