c - C 中的按位连接

标签 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 执行此操作是否有问题? ?

最佳答案

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

在您的示例中,“二进制数”不是二进制数。第一个是普通的十进制数( 1010 ),第二个是八进制数,因为前缀 0所以十进制的第二个数字是:9
所以发生的事情是:
1010 -> decimal
0011 -> octal

第一个数字:
     11 1111 0010      
----------------- << 4
11 1111 0010 0000

第二个数字(->十进制->二进制):
  octal    decimal       binary
  0011  ->    9     ->  0000 1001

而你的计算:
11 1111 0010 0000   first number
             1001   second number
----------------- |
11 1111 0010 1001 = 16169

关于c - C 中的按位连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28180015/

相关文章:

尽管尝试了一切,但仍无法在 C 中初始化我的数组计数器

android - 包括另一个 NDK lib 项目中预构建的静态/共享 NDK lib

c - 自然对齐的内存地址

c - Scanf 不起作用

c - 为什么使用float变量计算和我想的不一样?

c - GCC 内联汇编操作所有寄存器?

iphone - CoreData (for iphone) 存储图片

java - 如何在java中读取使用python的struct.pack方法编写的字符串

c++ - sprintf 比 print 占用更多空间?

c++ - 将 AES 加密的十六进制字符串转换回 C++ 中的字符串