为什么在写入寄存器时选择一个补码

时间:2012-01-23 10:12:10

标签: c microcontroller pic microchip operands

有什么好处,例如编写第一个语句与第二个语句:

第一句话:

ANCON1 = ~0x0C;

第二声明:

ANCON1 = 0xF3;

我看到第二个作为一个明确的选择我会做出来,因为它比第一个更直接。为什么要使用One's Complement,因为它只是简单地写出我们想要的东西。

5 个答案:

答案 0 :(得分:3)

我读了第一个All but 00001100和第二个11110011。我发现更容易理解哪些位没有在心理上设置,因为它们更少。

答案 1 :(得分:3)

Benoit几乎说了这么多。一个是补码,除了这些位之外的所有位,另一个是这些位。

something&=~3;

通常意味着你专注于那两个位,其中0xFC专注于其他位。 〜版本在某些平台上直接映射到一个清晰的指令,这使得作者可能会以这种方式更好地编写它。并且〜版本不容易出现错误和错误,如果你改变变量的大小(不移动这两位),你的代码仍然有效,使用0xFC代码被破坏,必须在使用变量的任何地方触及。 (使用#define隐藏常量会使调试变得更糟。如果重用了define,它可能会更好,但损坏已经完成了。)

在一天结束时虽然它是一种风格的东西,就像

一样
if(!(x&something) {

VS

if((x&something)==0) {

vs

if(x&something) ; else {

在绘画或绘画课程中,您可能会被教导专注于负面,背景,不要绘制对象的轮廓,而是绘制不是对象的轮廓。

在大学(电气工程,至少几十年前,在计算机工程出现之前),我们被鼓励从负面逻辑的角度思考。有时断言意味着积极逻辑有时是负面逻辑,而不是只考虑一种方式。 (同样认为断言或接通是正电压,VCC,以及断言或断开接地)

这种按位操作特别能够以任何方式读取代码,“我将这些位置零”与“我没有将这些位置零”。因为两者都是正确的,只是风格差异。

将0xC写为0xF3就像“简单”一样,如果你被口头告诉例如或数据表说bit [3:2]是什么,这就是零,那就是零。大脑不能将其作为0xC处理,要将其处理为0xF3,您必须找到关于物体长度的更多信息,然后在达到0xF3之前和之后处理这些位。或者你从0x0C开始在脑中做了0xF3,你可能刚刚使用了~0x0C并保存了步骤。如果有一个图表显示所有位并排标记的字段然后它变成一个半空或半满的玻璃,你和你的眼睛可以很容易地聚焦在负面并直接拉0xF3或者关注0x0C然后反转为获取0xF3或关注0xF3并且必须反转以获得0x0C。

一个远不如另一个重要的优点是,在一些处理器上,它直接与指令相关联,优化器不必像硬件一样工作(微优化),另一个是避免软件错误的习惯。如果您在几年前使用int 0xFFFFFFF3,那么今天编译该代码而不对64位机器进行任何修改,您可能已经陷入了一个错误。如果在代码中习惯使用该方法,则需要进行大量移植。如果使用了~0xC,则该代码可能移植得更顺畅。一个暗示变量的大小而另一个暗示变量的大小。

答案 2 :(得分:1)

没有区别,因为两个值都是常量,第一个值将由编译器计算并优化为第二个值。使用让您和其他程序员更容易理解代码的那个。

另一件事是,如果你使用变量来否定,然后在大多数微控制器上使用2个命令将变量写入寄存器,并且只写一个变量来注册使用1。

答案 3 :(得分:1)

首先,〜表示按位补码。不要将其与一个补码混合,一个补码是将十六进制转换为有符号整数格式的方法。

关于好/坏的做法,你的两个例子都很糟糕,因为他们使用的是“魔术数字”。编写相同代码的好方法是

#define MASK 0x0C

ANCON1 = ~MASK;

由于MASK是有意义的,0xF3是一些随机幻数,你应该使用前者,然后将其反转。

请注意,在整数常量上使用的〜运算符在编译时进行预处理。实际的机器代码仍然类似于LOADx $F3

答案 4 :(得分:0)

这通常只是风格问题。第一个x = ~y是一个惯用词,通常用来表示设置x中的所有位,但y 中的位除外。

它更常用于&=运算符。例如,x &= ~y表示清除x中设置的y中的位。在这种情况下,它的可读性更高,例如x &= ~0x40而不是x &= 0xFC