如何更改32位整数的字节?

时间:2017-01-27 21:24:49

标签: c bit-manipulation bit

我正在尝试仅使用逻辑语句和二进制算术运算符将两个二进制数组合在一起。但我对如何实际更改位感到困惑。它主要是我要改变的out变量,但每次打印时它都会变为零。

#include <stdio.h>

void execute_add(int a, int b){

int i = 0;
int bit;
int bit2;
int carryOut = 0;
int out = 10;
int overflow = 0;

for(i = 0; i <32 ; i++){

  bit = (a >> i) & 1;
  bit2 = (b >> i) & 1;

  if(bit==1 && bit2==1 && carryOut == 0){
        carryOut = 1;
        out = 0 | (0x1 >> i);

  }else if(bit==1 && bit2==1 && carryOut == 1){
        carryOut = 1;
        out = 1 | (0x1 >> i);

  }else if(bit==0 && bit2==0 && carryOut == 0){
        carryOut = 0;
        out= 0 | (0x1 >> i);

  }else if(bit==0 && bit2==0 && carryOut == 1){
        carryOut = 0;
        out = 1 | (0x1 >> i);

  }else if(bit==1 && bit2==0 && carryOut == 0){
        carryOut = 0;
        out = 1 | (0x1 >> i);

  }else if(bit==1 && bit2==0 && carryOut == 1){
        carryOut = 1;
        out = 0 | (0x1 >> i);

  }else if(bit==0 && bit2==1 && carryOut == 0){
        carryOut = 0;
        out = 1 | (0x1 >> i);

  }else if(bit==0 && bit2==1 && carryOut == 1){
        carryOut = 1;
        out = 0  | (0x1 >> i);

  }else{

  }//if else

 }//for loop

   printf("\n");

   bit = (a >> 31) & 1;
   bit2 = (a >> 31)& 1;
   int bit3 = (out >> 31) & 1;

   if( bit == 1 && bit2== 1 && bit3 == 0){
     overflow = 1;

   }else if (bit == 0 && bit2 == 0 && bit3 == 1){
   overflow = 1;

   }else{

   }//overflow check

    int j;
    int g = 0;

    for(j = 31; j>=0; j--){

            if(g%4==0 && g!=0){
             printf(" ");
            }

        bit2 = (out >> j) & 1;

        printf("%d", bit2);
        g++;
    }

            printf("\n");
}

int main (){

  int a = 34;
  int b = 17;

  execute_add(a, b);
  return 0;
}

1 个答案:

答案 0 :(得分:1)

在for循环中使用这些语句中的每一个:

out = 0 | x;

您正在重置out,并清除您已完成的所有工作。你可能意思是这样做:

out = out | x

或者,相当于

out |= x

你也正在转移1到处都是,这不是你想要的;对于大于零的任何班次,这将给你零。我认为你经常在寻找左移,你可以使用右移。

我会讨论kaylum关于使用调试器的评论;即使您正确地移动了适当的班次和| out,您仍然会遇到可以通过调试器轻松修复的逻辑错误。