Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino 位数学-在一次操作中将两个相反的位(10或01)分配给一个数字,无论原始数字是什么_Arduino_Microcontroller_Stm32 - Fatal编程技术网

Arduino 位数学-在一次操作中将两个相反的位(10或01)分配给一个数字,无论原始数字是什么

Arduino 位数学-在一次操作中将两个相反的位(10或01)分配给一个数字,无论原始数字是什么,arduino,microcontroller,stm32,Arduino,Microcontroller,Stm32,假设我有一个二进制数X。是否可以在一次操作中将数字中的2位设置为10或01,而不考虑X的值 x ??= ??(0b01 << bit_position) 这对于单个位是可能的。我可以将位设置为1或0,无论原始数字是什么: x |= (1 << bit_position) // Ensures bit at bit_position is 1 always. ??是我无法理解的部分 请注意,我不想切换位。只需将相关的设置为01或10它就不会有那种形式。你必须屏蔽掉你想从

假设我有一个二进制数
X
。是否可以在一次操作中将数字中的2位设置为
10
01
,而不考虑
X
的值

x ??= ??(0b01 << bit_position)
这对于单个位是可能的。我可以将位设置为
1
0
,无论原始数字是什么:

x |= (1 << bit_position) // Ensures bit at bit_position is 1 always.
??
是我无法理解的部分


请注意,我不想切换位。只需将相关的设置为
01
10

它就不会有那种形式。你必须屏蔽掉你想从一个字节更改的位和你想从另一个字节保留的位

// put 0 in bit 2 and 1 in bit 3

byte mask = 0b00001100;  // The bits I want to play with
byte pattern = 0b00001000;  // doesn't matter what any bit but 2 and 3 are

someByte = ((pattern & mask) | (somebyte & ~mask));

但它不会有那种形式。你必须屏蔽掉你想从一个字节更改的位和你想从另一个字节保留的位

// put 0 in bit 2 and 1 in bit 3

byte mask = 0b00001100;  // The bits I want to play with
byte pattern = 0b00001000;  // doesn't matter what any bit but 2 and 3 are

someByte = ((pattern & mask) | (somebyte & ~mask));
和更一般的方式

uint32_t SetBits(uint32_t InitialValue, uint32_t pattern, int pos, int nbits)
{
 uint32_t mask = (((1 << nbits) - 1) << pos); 
 InitialValue &= ~mask;
 return InitialValue | (pattern & mask)
}
uint32设置(uint32初始值、uint32模式、int pos、int nbits)
{
uint32_t mask=((1和更一般的方法

uint32_t SetBits(uint32_t InitialValue, uint32_t pattern, int pos, int nbits)
{
 uint32_t mask = (((1 << nbits) - 1) << pos); 
 InitialValue &= ~mask;
 return InitialValue | (pattern & mask)
}
uint32设置(uint32初始值、uint32模式、int pos、int nbits)
{

uint32_t mask=((1个绝妙的答案。这是bitmath中使用的标准模式吗?它叫什么?另外,在最后一行,我想你的意思是
someByte=((模式和掩码)|(someByte&~mask))谢谢,是的,我把它修好了。它没有名字。这只是我能想到的最简单的一个比特数,我可以按照你的要求去做。这就是你用这些东西所做的。它不是记住一堆模式。你学习事情如何运作并解决它。我想如果我只有我想要的位置上的1,我就能做到在目标字节中设置这些位置0,然后我就把它们放在一起。我确信还有其他方法可以剥猫皮。非常适合我的需要。谢谢,我需要阅读更多关于掩蔽的内容。一些背景知识,将其用于STM32411RET6芯片。浏览头文件中模糊的宏,看起来它们使用的是稍微不同的nt模式-
someByte=(模式|(someByte&~mask))
。这看起来效率更高,因为它只需一次操作,但它似乎需要“不在乎”
模式中的位
为0。不过,你的方法要好得多,更能防止白痴。我的错误最初是因为我是这样开始的,并决定添加位不重要的模式,只是为了使其更一般化。这样,你可以选择要放入模式的哪两位。如果我们总是使用相同的两位,然后确定,使它们为0并且不需要掩码更有效。非常好-回答了这么多问题。这是bitmath中使用的标准模式吗?它叫什么?另外,对于最后一行,我想你的意思是
someByte=((模式和掩码)|(someByte&~mask))谢谢,是的,我把它修好了。它没有名字。这只是我能想到的最简单的一个比特数,我可以按照你的要求去做。这就是你用这些东西所做的。它不是记住一堆模式。你学习事情如何运作并解决它。我想如果我只有我想要的位置上的1,我就能做到在目标字节中设置这些位置0,然后我就把它们放在一起。我确信还有其他方法可以剥猫皮。非常适合我的需要。谢谢,我需要阅读更多关于掩蔽的内容。一些背景知识,将其用于STM32411RET6芯片。浏览头文件中模糊的宏,看起来它们使用的是稍微不同的nt模式-
someByte=(模式|(someByte&~mask))
。这看起来效率更高,因为它只需一次操作,但它似乎需要“不在乎”
模式中的位
为0。不过,你的方法要好得多,更能防止白痴。我的错误最初是因为我是这样开始的,并决定添加位不重要的模式,只是为了使其更一般化。这样,你可以选择要放入模式的哪两位。如果我们总是使用相同的两位然后确定,将它们设置为0并且不需要掩码更有效。哇,这太棒了!我喜欢你在函数中创建掩码的方式。我猜最后一条语句也可以指定为
#define
宏。哇,这太棒了!我喜欢你在游戏中创建掩码的方式我猜最后一条语句也可以指定为
#define
宏。你说的“单次操作”是什么意思?一行C代码、一个C运算符、一条CPU指令、一个原子操作,或者什么?我指的是一行C代码。我一直在为同一寄存器设置的每2位使用2行代码,这影响了我的代码可读性。你说的“单次操作”是什么意思?一行C代码,一个C运算符,一条CPU指令,一个原子操作,或者什么?我指的是一行C代码。我一直在使用两行代码,每两个需要为同一寄存器设置的位,它会影响我的代码可读性。