89c51单片机问题!!

采用“与”运算,判断某8位二进制是奇数还是偶数个1!
2024-12-02 15:14:41
推荐回答(2个)
回答(1):

一定要瞎运知采用与运算的话,我是这样算的:
unsigned char target; //待测试数
unsigned char tmp,i,j; //变量

tmp=0x01;
j=0;
for(i=7;i<=0;i--){
if(target&tmp!=0){ //假如target&tmp!=0,则说明target当前位为1
j+=1; //为1则j加1
}
tmp<<=1; //tmp左移一位
}

接下来判断j是偶数还是奇数就能知道target里1的个数了。

回hanxingfdx :
tmp<<=1;意思是tmp=tmp<<1;tmp的初始值为00000001b,我的悄滑方法是每一位用与运算来检测,想不出更好的算法,让您见磨消笑了。您说的target右移一位也是可以的,只是我在这里尽量不去更改被检测数据的值。

回答(2):

NUMBER EQU 10110101
COUT EQU 30H
ODD EQU 20H.0
EVEN EQU 20H.1
main:
MOV COUT,#0
MOV R0,#8
LOOP:
MOV A,NUMBER;
AND A,01H;
JNZ ODD_EVEN;
RR A
MOV NUMBER,A;
DEC R0
MOV A,RO
CJNE A,#0,LOOP
MOV A,COUT;
MOV B,#2
DIV AB
MOV A,B
JNZ EV_EN
SETB ODD
END

ODD_EVEN:
INC COUT;
RET

EV_EN:
SETB EVEN
RET

汇编和C的区别- -!郑雀举
另外楼上不该tmp<<=1; 应岁祥该target>>1吧?
<<=??什么符号??
谢谢楼上回答 又学到了符号的简单表示
还是认为应该target>>1 否则 if(target&tmp!=0)的表示就是有错误的
不知道我喊碧理解的对不对。