У меня есть назначение добавить два символа без знака, используя shifting. s является резюме, p является "переполнением", я не знаю, как это сказать. это мой код, что-то не так, он всегда печатает 0 0
unsigned char get_bit(unsigned char x, int i){
return (x>>i)&1;
}
void set_bit(unsigned char *x, int i, unsigned char b){
*x=(b<<i)|(*x&~(1<<i));
}
void f(unsigned char x, unsigned char y, unsigned char *s, unsigned char *p){
int i;
unsigned char k=0,c=0;
for(i=0;i<8;i++){
unsigned char m=0;
m=get_bit(x,i)+get_bit(y,i)+c;
if(m==2) {
m=0;
c=1;
}
else c=0;
set_bit(s,i,m);
}
*s=(unsigned char)k;
*p=(unsigned char)c;
}
Ну сначала вам не хватает случая, когда m == 3 (когда оба бита равны 1, а перенос - 1).
Во-вторых, вы сохраняете свой ответ в s, а затем перезаписываете его значением k, которое никогда не устанавливается, поэтому вы получаете 0 в конце. Либо удалите строку *s=(unsigned char)k;
или изменить set_bit(s,i,m);
set_bit(&k,i,m);
*x = *x & ~(1 << i) | (b << i)
чтобы избежать использования +
и -
. Если бы вы могли использовать +
, вы могли бы также добавить два исходных числа;)
k
используется в вашем коде? А добавление пробела помогает легче читать, а не убивать вас, почему вы избегаете его использовать?