3

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

第一个声明:

ANCON1 = ~0x0C;

第二个声明:

ANCON1 = 0xF3;

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

4

5 回答 5

3

I read the first one All but 00001100 and the second 11110011. I find it easier to understand what bits are NOT set mentally, because there are fewer.

于 2012-01-23T10:16:16.073 回答
3

Benoit 说得差不多了。一个是补码,除了这些位之外,另一个是这些位。

something&=~3;

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

归根结底,尽管它是一种风格,就像

if(!(x&something) {

对比

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

对比

if(x&something) ; else {

在绘画或绘画课上,你可能会被教导要专注于底片、背景,不要画物体的轮廓,而是要画出不是物体的轮廓。

在大学里(电气工程,至少在计算机工程出现之前的几十年前),我们被鼓励用否定逻辑来思考。有时断言意味着积极的逻辑,有时是消极的逻辑,不要只思考一种方式。(同样认为断言或打开是正电压,VCC,而取消断言或关闭是接地)

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

将 0xC 写为 0xF3 就像“简单”一样,例如,如果您被口头告知或数据表中说 bits[3:2] 是某物,那么当为零时。大脑将其处理为 0xC 并不是一件容易的事,要将其处理为 0xF3,您必须找到有关事物长度的更多信息,然后在到达 0xF3 之前和之后处理位。或者您从 0x0C 开始在您的脑海中执行 0xF3,您可以使用 ~0x0C 并保存该步骤。如果有一个图表显示所有位并排并标有字段,那么它变成一个玻璃是半空或半满的东西,你和你的眼睛可能很容易集中在负片上并直接拉 0xF3 或集中在 0x0C 然后反转为获得 0xF3 或专注于 0xF3 并且必须反转才能获得 0x0C。

这两个优点远不如另一个重要,即在少数处理器上它直接与指令相关联,优化器不必努力工作(微优化),另一个是避免软件错误的习惯。如果您在几年前使用带有 0xFFFFFFF3 的 int,然后在今天编译该代码而没有针对 64 位机器进行任何修改,您可能已经陷入了一个错误。如果在代码中习惯性地使用该方法,那么还有很多移植工作要做。如果使用了 ~0xC,那么该代码可能会更顺利地移植。一个暗示变量的大小,另一个不暗示。

于 2012-01-23T14:57:56.777 回答
1

There's no difference because both values are constant and the first one will be counted and optimized to second one by your compiler. Use the one that makes code more understandable by you and other programmers.

The other thing would be if you used variable-to negate and then to write a variable to the register on most microcontrollers uses 2 commands and to only write a variable to register uses 1.

于 2012-01-23T10:16:12.070 回答
1

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

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

#define MASK 0x0C

ANCON1 = ~MASK;

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

请注意,整数常量上使用的 ~ 运算符在编译时进行了预处理。实际的机器代码仍然看起来像LOADx $F3.

于 2012-01-23T10:50:57.403 回答
0

It's typically only a matter of style. The first, x = ~y is an idiom commonly used to denote set all bits in x except those in y.

It is even more commonly used together with the &= operator. For example x &= ~y means to clear the bits in x that are set in y. In this case, it's is more readable to write, for example x &= ~0x40 rather than x &= 0xFC.

于 2012-01-23T10:16:24.603 回答