C中的逐位串联

Ros*_*nan 2 c binary printf bit-manipulation bitwise-operators

我试图在C中连接两个二进制数.所以,如果我有1010,0011我想要我的结果10100011.我写了一个我认为可以完成工作的简短例程:

#include <stdio.h>

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

我知道打印的数字当然是十进制的,但我想在我的按位操作之后我会得到十进制等值的10100011,或者是163.但是,我的结果打印为16169.所以我想我的问题是......我在这里不明白这部分是什么?这只是对printf如何工作的误解,还是我的按位操作不正确?尝试用ints 做这个是一个问题吗?

Riz*_*123 7

你忘记了前缀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;

}
Run Code Online (Sandbox Code Playgroud)

输出:

163
Run Code Online (Sandbox Code Playgroud)

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

所以发生了什么:

1010 -> decimal
0011 -> octal
Run Code Online (Sandbox Code Playgroud)

第一个数字:

     11 1111 0010      
----------------- << 4
11 1111 0010 0000
Run Code Online (Sandbox Code Playgroud)

第二个数字( - >十进制 - >二进制):

  octal    decimal       binary
  0011  ->    9     ->  0000 1001
Run Code Online (Sandbox Code Playgroud)

而你的计算:

11 1111 0010 0000   first number
             1001   second number
----------------- |
11 1111 0010 1001 = 16169
Run Code Online (Sandbox Code Playgroud)