C中的逐位串联

时间:2015-01-27 21:07:29

标签: c binary printf bit-manipulation bitwise-operators

我试图在C中连接两个二进制数。所以,如果我有10100011,我希望我的结果为10100011。我写了一个我认为可以完成这项工作的简短例程:

#include <stdio.h>

int main(void) {
    int first = 1010;
    int second = 0011;
    int result = (first << 4) | second;
    printf("%d", result);
    return 0;
}

据我所知,打印的数字当然是十进制的,但我认为在我的按位操作后,我得到的等级为10100011或163.但是,我的结果打印为16169.所以我想我的问题是......我在这里不明白这部分是什么?这只是对printf如何工作的误解,还是我的按位操作不正确?尝试使用int s执行此操作是否有问题?

4 个答案:

答案 0 :(得分:5)

您忘记了前缀0b,因此这适用于您:

#include <stdio.h>

int main() {

    int first = 0b1010;
              //^^v See here
    int second = 0b0011;
    int result = (first << 4) | second;
    printf("%d", result);

    return 0;

}

输出:

163

在您的考试中,二进制数字&#39;不是二进制数。第一个是正常的十进制数(1010),第二个是八进制数,因为前缀为0所以十进制中的第二个数字为:9

所发生的事情是:

1010 -> decimal
0011 -> octal

第一个数字:

     11 1111 0010      
----------------- << 4
11 1111 0010 0000

第二个数字( - &gt; decimal-&gt; binary):

  octal    decimal       binary
  0011  ->    9     ->  0000 1001

你的计算:

11 1111 0010 0000   first number
             1001   second number
----------------- |
11 1111 0010 1001 = 16169

答案 1 :(得分:0)

如果您不想依赖新标准,您可以学习十六进制的简单规则过度扩展二进制系统

&#13;
&#13;
HEX  BIN
 00  0000
 01  0001
 02  0010
 03  0011
 04  0100
 05  0101
 06  0110
 07  0111
 08  1000
 09  1001
 0A  1010
 0B  1011
 0C  1100
 0D  1101
 0E  1110
 0F  1111
 10 10000
&#13;
&#13;
&#13;

所以你的程序可能被重写为:

&#13;
&#13;
#include <stdio.h>

int main(void) {
    int first = 0xA;  // 1010;
    int second = 0x3; // 0011;
    int result = (first << 4) | second;
    printf("%X", result);
    return 0;
}
&#13;
&#13;
&#13;

答案 2 :(得分:0)

也不能返回(0xA << 4)+ 0x3。

换句话说

1010 0000 + 0000 0011 = 1010 0011

答案 3 :(得分:0)

使用字符串并将其连接起来。它们的值将被读取为整数,因此(int << 0x4)不会再向左移动4个空格,而是将其乘以16。

int b10tob2(int num) {
    int bin = 0, k = 1;

    while (num) {
        bin += (num % 2) * k;
        k *= 10;
        num /= 2;
    }

    return bin;
}
相关问题