我试图在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;
}
据我所知,打印的数字当然是十进制的,但我认为在我的按位操作后,我得到的等级为10100011
或163.但是,我的结果打印为16169.所以我想我的问题是......我在这里不明白这部分是什么?这只是对printf如何工作的误解,还是我的按位操作不正确?尝试使用int
s执行此操作是否有问题?
答案 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)
如果您不想依赖新标准,您可以学习十六进制的简单规则过度扩展二进制系统
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;
所以你的程序可能被重写为:
#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;
答案 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;
}