C++ 关于按位And和Shift运算的问题
如果pData=abc,下面几行具体是如何工作的C++ 关于按位And和Shift运算的问题,c++,bit-manipulation,bitwise-operators,C++,Bit Manipulation,Bitwise Operators,如果pData=abc,下面几行具体是如何工作的 C++将根据字符的编码将其视为数字。因此,假设ASCII,‘a’是97,其位模式为0110_0001,‘b’是98位模式0110_0010 一旦您将它们视为数字,对字符的位操作就应该更加清晰。C++将根据字符的编码将字符视为数字。因此,假设ASCII,‘a’是97,其位模式为0110_0001,‘b’是98位模式0110_0010 一旦您将它们视为数字,字符上的位操作就应该更清晰一些。好的,假设ASCII不能保证,pData[0]是“a”0x61
C++将根据字符的编码将其视为数字。因此,假设ASCII,‘a’是97,其位模式为0110_0001,‘b’是98位模式0110_0010
一旦您将它们视为数字,对字符的位操作就应该更加清晰。C++将根据字符的编码将字符视为数字。因此,假设ASCII,‘a’是97,其位模式为0110_0001,‘b’是98位模式0110_0010
一旦您将它们视为数字,字符上的位操作就应该更清晰一些。好的,假设ASCII不能保证,pData[0]是“a”0x61,pData[1]是“b”0x62: 它输出:
00001862 00000000
并且,当您将PDE更改为字符数组时,您会得到:
00000062 00000000
好的,假设ASCII是绝对不能保证的,pData[0]是'a'0x61,pData[1]是'b'0x62: 它输出:
00001862 00000000
并且,当您将PDE更改为字符数组时,您会得到:
00000062 00000000
&不是逻辑AND-它是按位AND
a是0x61,因此pData[0]&0x1c给出
>>2将其向右移动两个位置-值不会改变,因为所有位都为零
pData[0]&不是逻辑AND-它是按位AND
a是0x61,因此pData[0]&0x1c给出
>>2将其向右移动两个位置-值不会改变,因为所有位都为零
pData[0]在C中,所有字符也是整数。这意味着abc相当于char[]{0x61,0x62,0x63,0} &不是逻辑AND运算符&。它是在位级别计算和的,例如
'k' = 0x6b -> 0 1 1 0 1 0 1 1
0x1c -> 0 0 0 1 1 1 0 0 (&
———————————————————
8 <- 0 0 0 0 1 0 0 0
以位为单位,如果
pData[1] pData[0]
pData -> b7 b6 b5 b4 b3 b2 b1 b0 a7 a6 a5 a4 a3 a2 a1 a0
然后
这看起来像是将三个值打包成6-5-5位结构的操作。在C中,所有字符也是整数。这意味着abc相当于char[]{0x61,0x62,0x63,0} &不是逻辑AND运算符&。它是在位级别计算和的,例如
'k' = 0x6b -> 0 1 1 0 1 0 1 1
0x1c -> 0 0 0 1 1 1 0 0 (&
———————————————————
8 <- 0 0 0 0 1 0 0 0
以位为单位,如果
pData[1] pData[0]
pData -> b7 b6 b5 b4 b3 b2 b1 b0 a7 a6 a5 a4 a3 a2 a1 a0
然后
这看起来像是一个将三个值打包到6-5-5位结构中的操作。为什么不运行它们并查看它们?您使用了两次“a”,而根本没有使用“c”。你确定这段代码是预期的吗?对收信人说:这到底是一个与编程无关的问题吗?对我来说,它看起来像C++代码,所以它应该是所有技能级别的,包括那些不知道按位操作的人。看起来,也许你正在尝试实现某种Base64编码器的一部分。如果那是你想要的,你为什么不问这个问题呢?基本上,你的问题的大背景是什么,这样你才能得到更好、更完整的答案:-可以是base64,但我希望将3个字节解码为2将使用0xfc而不是0x1c 0x1c只有3位,而不是6位,并且PDE[1]需要从pData[0]和[1]构建。所以我不太确定。如果你是对的,那么你为什么不运行它们看看呢?你用了两次“a”而不用“c”。你确定这段代码是预期的吗?对收信人说:这到底是一个与编程无关的问题吗?对我来说,它看起来像C++代码,所以它应该是所有技能级别的,包括那些不知道按位操作的人。看起来,也许你正在尝试实现某种Base64编码器的一部分。如果那是你想要的,你为什么不问这个问题呢?基本上,你的问题的大背景是什么,这样你才能得到更好、更完整的答案:-可以是base64,但我希望将3个字节解码为2将使用0xfc而不是0x1c 0x1c只有3位,而不是6位,并且PDE[1]需要从pData[0]和[1]构建。所以我不太确定。很好的回答,如果你是对的@Omni。如果pDes是一个整型数组的高位'a',我发现这个答案比另一个更容易理解,这是一个不错的答案。@Amargosh,是的,我对此进行了重新思考,你完全正确,过渡被视为一个更大的类型。编辑以修复。谢谢guies…我真的需要这个:如果PDE是一个整型数组的高位'a',我发现这个答案比另一个更容易理解,这是一个不错的答案。@Amargosh,是的,我对此进行了重新思考,你完全正确,过渡被视为一个更大的类型。编辑以修复。谢谢你,guies…我真的需要这个:
0x1840 0001 1000 0100 0000
0x0022 0000 0000 0010 0010
--------------------------
0x1862 0001 1000 0110 0010
'k' = 0x6b -> 0 1 1 0 1 0 1 1
0x1c -> 0 0 0 1 1 1 0 0 (&
———————————————————
8 <- 0 0 0 0 1 0 0 0
'k' = 0x6b -> 0 1 1 0 1 0 1 1
<< 6 = 0 1 1 0 1 0 1 1 0 0 0 0 0 0
xxxxxxxxxxx—————————————————
0xc0 <- 1 1 0 0 0 0 0 0
pData[1] pData[0]
pData -> b7 b6 b5 b4 b3 b2 b1 b0 a7 a6 a5 a4 a3 a2 a1 a0
pDes -> 0 0 0 0 0 a4 a3 a2 a1 a0 b5 b4 b3 b2 b1 b0
pDes[1] pDes[0]