C 理解移位和逻辑运算
我正在尝试读取SD卡的“大小”。我正在使用的示例具有以下代码行: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
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));