STM32里的一串代码的疑惑

这个是啥意思,可以解答一下这串代码不懂的问题:GPIOB->ODR= ((GPIOB->ODR&~(0xff00)) | (table[a%10]&0xff)<<8)

1、(0xff00):取反操作,结果是0x00ff
2、((GPIOB->ODR&
(0xff00)):与运算,就是把ODR里面的值跟0x00ff与,结果是ODR低8位数据保留不变,高8位数据清0
3、table[a%10]:a对10求余,余数是0到9,table[a%10]就是table这个数组前10个数的其中一个,具体是哪个取决于a的值
4、table[a%10]&0xff:与运算,table[]的值跟0xff与,table[]的低8位数据不变,高位全部清0
5、(table[a%10]&0xff)<<8:左移运算,table[]的低8位数据不变,然后往左移动8位,也就是在table[]的低8位数据后面加8个0
6、((GPIOB->ODR&(0xff00)) | (table[a%10]&0xff)<<8):或运行,前面的((GPIOB->ODR&(0xff00))结果是ODR高8位为0,8位保留,后面的 (table[a%10]&0xff)<<8)结果是table[]的低8位数据后面加8个0,两部分进行或运算之后,ODR高8位的数据被table[]低8位的值覆盖,ODR低8位的数据保留。

也就是说这个算式的结果是把table[]数组前10个数的其中一个拿出来把高位去掉,保留低8位数据,然后把这个8位数据替代掉原来ODR寄存器的高8位数据。