I'm trying to concatenate two binary numbers in C. So if I have 1010 and 0011 I want my result to be 10100011. I wrote a short routine that I thought would do the job:
#include <stdio.h>
int main(void) {
    int first = 1010;
    int second = 0011;
    int result = (first << 4) | second;
    printf("%d", result);
    return 0;
}
I understand that the printed number of course is going to be in decimal, but I figured that after my bitwise operations I'd be getting the decimal equivalent of 10100011, or 163. However, my result is printed as 16169. So I guess my question is...what part of this am I not understanding here? Is it just a misunderstanding of how printf is working, or are my bitwise operations incorrect? Is it a problem to try to do this with ints?
You forgot the prefix 0b, so this should work for you:
#include <stdio.h>
int main() {
    int first = 0b1010;
              //^^v See here
    int second = 0b0011;
    int result = (first << 4) | second;
    printf("%d", result);
    return 0;
}
Output:
163
In your examle the 'binary numbers' aren't binary numbers. The first one is a normal decimal number (1010) and the second one is a octal number, because of the prefix 0 so in decimal the second number was: 9
So what happened is:
1010 -> decimal
0011 -> octal
First number:
     11 1111 0010      
----------------- << 4
11 1111 0010 0000
Second number (->decimal->binary):
  octal    decimal       binary
  0011  ->    9     ->  0000 1001
And your calculation:
11 1111 0010 0000   first number
             1001   second number
----------------- |
11 1111 0010 1001 = 16169
                        If you do not want to be dependent on the new standard, you can learn a simple rule overextension binary system in hexadecimal
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
So you program may be rewritten as:
#include <stdio.h>
int main(void) {
    int first = 0xA;  // 1010;
    int second = 0x3; // 0011;
    int result = (first << 4) | second;
    printf("%X", result);
    return 0;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With