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

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

如果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,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]