C 理解移位和逻辑运算

C 理解移位和逻辑运算,c,bitwise-operators,logical-operators,C,Bitwise Operators,Logical Operators,我正在尝试读取SD卡的“大小”。我正在使用的示例具有以下代码行: unsigned char xdata *pchar; // Pointer to external mem space for FLASH Read function; pchar += 9; // Size indicator is in the 9th byte of CSD (Card specific data) register; // Extract size indicator bits; size = (un

我正在尝试读取SD卡的“大小”。我正在使用的示例具有以下代码行:

unsigned char xdata *pchar; // Pointer to external mem space for FLASH Read function;
pchar += 9; // Size indicator is in the 9th byte of CSD (Card specific data) register;

 // Extract size indicator bits;
size = (unsigned int)((((*pchar) & 0x03) << 1) | (((*(pchar+1)) & 0x80) >> 7));
无符号字符扩展数据*pchar;//指向外部mem空间的指针,用于闪存读取功能;
pchar+=9;//尺寸指示器位于CSD(卡专用数据)寄存器的第9字节;
//提取大小指示位;
大小=(无符号整数)((*pchar)&0x03)>7);

我无法理解在提取指示符位的上面一行中实际做了什么。有人能帮我理解这个吗

大小指示符(如SI)似乎由3位组成,其中
*pchar
在其最低两位(
0x03
)中包含SI的两个最高有效位,
*(pchar+1)
在其最高位(
0x80
)中包含SI的最低有效位。

大小指示符(如SI)似乎由3位组成,其中,
*pchar
在其最低两位(
0x03
)中包含SI的两个最高有效位,
*(pchar+1)
在其最高位(
0x80
)中包含SI的最低有效位。

第一行和第二行指出如何指向所需的数据

现在让我们从左到右完成相关步骤

操作的第一部分获取由
pchar
指向的字节,对字节和
0x03
执行逻辑AND运算,并将结果移位一位

然后,该结果与下一个字节
(*pchar+1)
进行逻辑或运算,然后与
0x80
进行AND运算,然后将其右移七位。基本上,这一部分只是去掉字节中的第一位,并将其移位七位

结果基本上是这样的:

想象一下,
pchar
指向以字母表示位的字节:
ABCDEFGH

第一部分是
0x03
,因此剩下
000000GH
。然后将其左移一位,因此剩下的是
00000GH0

正确的部分也是一样
pchar+1
IJKLMNOP
表示。对于第一个逻辑AND,我们只剩下
I0000000
。然后将其右移七次。所以我们有
000000i
。这与使用OR的左手部分相结合,因此我们得到了
00000GHI
,然后将其转换为一个整数,该整数保存您的大小


基本上,有三个位保持大小,但它们不是字节对齐的。因此,需要进行一些操作。

第一行和第二行指出如何指向所需的数据

现在让我们从左到右完成相关步骤

操作的第一部分获取由
pchar
指向的字节,对字节和
0x03
执行逻辑AND运算,并将结果移位一位

然后,该结果与下一个字节
(*pchar+1)
进行逻辑或运算,然后与
0x80
进行AND运算,然后将其右移七位。基本上,这一部分只是去掉字节中的第一位,并将其移位七位

结果基本上是这样的:

想象一下,
pchar
指向以字母表示位的字节:
ABCDEFGH

第一部分是
0x03
,因此剩下
000000GH
。然后将其左移一位,因此剩下的是
00000GH0

正确的部分也是一样
pchar+1
IJKLMNOP
表示。对于第一个逻辑AND,我们只剩下
I0000000
。然后将其右移七次。所以我们有
000000i
。这与使用OR的左手部分相结合,因此我们得到了
00000GHI
,然后将其转换为一个整数,该整数保存您的大小


基本上,有三个位保持大小,但它们不是字节对齐的。因此,需要进行一些操作。

大小由两个字节中的位组成。一个字节位于
pchar
,另一个位于
pchar+1

(*pchar)&0x03)
获取2个最低有效位(斩波6个最高有效位)。
使用
将此结果向左移动一位
大小
由两个字节中的位组成。一个字节位于
pchar
,另一个位于
pchar+1

(*pchar)&0x03)
获取2个最低有效位(斩波6个最高有效位)。 使用
size=(unsigned int)(((*pchar)&0x03)>7)将该结果向左移位一位;
  • 有人能帮我理解这个吗
我们有字节
*pchar
和字节
*(pchar+1)
。每个字节由8位组成。 让我们用粗体索引
*pchar
的每一位:76543210,用斜体索引
*(pchar+1)
的每一位:76543210

一,<代码>(*pchar)和0x03xxxxxx 10-->xxxxx 10x

二,
(((*(pchar+1))&0x80)>>7)
表示“将
*(pchar+1)
除第7位之外的所有位置零,然后将结果向右移位7位”:

76543210-->7xxxxxxx-->xxxxxxx 7

3
(((*pchar)和0x03)>7))
表示“将左右操作数的所有非零位合并为一个字节”:

xxxxx 10x|xxxxxxx 7-->xxxxx 107

因此,在结果中,我们有两个来自
*pchar
的低位和一个来自
*(pchar+1)
size=(unsigned int)((((*pchar)&0x03)>7)的高位;
  • 有人能帮我理解这个吗
我们有字节
*pchar
和字节
*(pchar+1)
。每个字节由8位组成。 让我们用粗体索引
*pchar
的每一位:
11011010 (& 0x03/00000011)==> 00000010 (<< 1)==> 00000100 (-----10-)
11110110 (& 0x80/10000000)==> 10000000 (>> 7)==> 00000001 (-------1)
00000100 | 00000001 = 00000101 (-----101)
size = (unsigned int)((((*pchar) & 0x03) << 1) | (((*(pchar+1)) & 0x80) >> 7));