试试看:
#include <stdio.h>
#define HIGH 0
int main (void)
{
unsigned char i;
unsigned char PORTD;
unsigned char val;
PORTD=0;
for(val=3;val;val<<=1)
{
printf("0x%02X\n",val);
for(i=0;i<8;i++)
{
PORTD |= !!(val & (HIGH << i));
printf("PORTD 0x%02X\n",PORTD);
}
}
return(0);
}
我不知道你HIGH的定义是什么,但因为它们是跨字节走这8时间,我认为它是一个位,这也许能够提供正或负端口上的逻辑,所以可能是0或1我想。
我得到的所有0×01,如果HIGH为1,所有为0x00,如果高为0,因此似乎没有做点儿什么。当你有& &例如这是一个布尔表达式不按位逻辑,也许这是一个错字?
val&(HIGH<<i)
虽然很简单,但您应该发布HIGH被定义为什么,让我们假设它是1,因为这相对于代码的其余部分是最有意义的。有一个循环我是从0到7而去,这意味着你是安定(位)与1<<0
然后1<<1
然后1<<2
等。 1<<0
只是1个权利?因此val&(1<<0)
与val & 0x01相同。 1<<1 = 0x02
so val & 0x02。这段代码每隔一位就会隔离val中的各个位。你明白,如果例如val是0x07然后0x07 & 0x02 = 0x02?你行的每一位达0x07的= 0b00000111,0×02 = 0b00000010
00000111
&00000010
=========
00000010
你看这一次垂直隔离一列,并使用真值表基本上说,结果是0,除非两个操作数均为1
,有一列的两个操作数是1,所以该列的结果是1,其余列的一个或另一个操作数或两者都是零,因此该列的结果为零。
00000111
&00000100
=========
00000100
00000111
&000010000
=========
00000000
递增我两次,评估对的0x07的一个VAL和你看到的是与val&(HIGH<<i)
至少发生假设HIGH是1,如果高是0,那么你总是会得到零问世这段代码。
如果你想和一个走一个你为什么不只是做VAL &高,所以这同样没有道理,除非是外围或什么是该端口的另一端在同一时间的事情希望这一个位。
双爆(!!)对我来说看起来像一个逻辑操作,在这里没有业务IMO。
单爆炸是一个逻辑运算
#include <stdio.h>
#define HIGH 1
int main (void)
{
unsigned char i;
unsigned char PORTD;
unsigned char val;
PORTD=0;
val=3;
{
printf("0x%02X\n",val);
for(i=0;i<8;i++)
{
PORTD |= !(val & (HIGH << i));
printf("PORTD 0x%02X\n",PORTD);
}
}
return(0);
}
这里的希望是,我们知道编译器将生成0x00作为一个假的,但到底是什么它产生的是真的吗? 0x01,0xFF,C语言可能有一个定义。所以上面的代码是genrating基于我们的价值
PORTD 0x00
PORTD 0x00
PORTD 0x01
PORTD 0x01
PORTD 0x01
PORTD 0x01
PORTD 0x01
PORTD 0x01
在位置,所以LSb的比特流,该循环发痒的时钟。
我个人的偏好不会玩与C语言规范的游戏,但要明确你想要做什么:
#include <stdio.h>
#define HIGH 1
int main (void)
{
unsigned char i;
unsigned char PORTD;
unsigned char val;
PORTD=0;
val=3;
{
printf("0x%02X\n",val);
for(i=0;i<8;i++)
{
PORTD |= (~(val>>i))&1;
printf("PORTD 0x%02X\n",PORTD);
}
}
return(0);
}
PORTD 0x00
PORTD 0x00
PORTD 0x01
PORTD 0x01
PORTD 0x01
PORTD 0x01
PORTD 0x01
PORTD 0x01
使用的所有位操作,没有布尔真/假操作。
想知道他们是否试图做两个布尔穷人连续的不为零的位第一或7 - 我第一次转移到零位位置或东西...而不是为为,所以LSb最高位。
#include <stdio.h>
#define HIGH 1
int main (void)
{
unsigned char i;
unsigned char PORTD;
unsigned char val;
PORTD=0;
val=3;
{
printf("0x%02X\n",val);
for(i=0;i<8;i++)
{
PORTD |= (val>>i)&1;
printf("PORTD 0x%02X\n",PORTD);
}
}
return(0);
}
对我来说很难过。 –
你是什么意思? – sesc360
这是Arudino'wiring_shift.c'的原始代码,除了1已被更改为HIGH – sesc360