C Language | Sololearn: Learn to code for FREE!
New course! Every coder should learn Generative AI!
Try a free lesson
0

C Language

#include <stdio.h> int main() { int y = 0; int x = (~y == 1); printf("%d", x); return 0; }

22nd Oct 2018, 2:14 PM
Abhishek Kumar Singh
Abhishek Kumar Singh - avatar
5 Answers
+ 4
~ is the bitwise inversion operator, it works by inverting each bit in a number, when a bit value is 0, it is inverted to 1, vice versa. <y> value is zero, ~y yields -1, when you compare value of ~y and 1 it evaluates to false (zero), because they're not equal. Then store the comparison result (which is false, or zero) in <x>, this means <x> value is now zero, then you print value of <x>, I guess that's what happened : ) Hth, cmiiw
22nd Oct 2018, 2:28 PM
Ipang
+ 4
Simple yet to the point explanation, Ipang . ;) Also, I want to emphasize the importance of keeping an eye on the signedness of the variable before performing bit-level operations. Because in a specific bit field each signed and unsigned version of the same variable lead to different interpretation by the machine , for example int x = 0; Binary form (32bit) of the x: 0000 0000 0000 0000 0000 0000 0000 0000 comprises one signed bit (bit 31st) and thirty one magnitude bits (bit 0 to 30) unsigned int y = 0; With the same binary form as the x but comprises thirty two magnitude bits (all bits) So, making a one's complement like ~x or ~y just flips the bits on-the-fly during comparison as 1111 1111 1111 1111 1111 1111 1111 1111 but depends on being signedness, it will be interpreted to -1(for x in two's complement) or 4294967295 (for y) _____ Further readings: 1. https://en.m.wikipedia.org/wiki/Ones'_complement 2. http://sandbox.mc.edu/~bennet/cs110/tc/tctod.html
22nd Oct 2018, 4:35 PM
Babak
Babak - avatar
+ 4
Thanks Ipang for encouraging comments. Yeah, specifically when doing arithmetic shift right operation you almost always want to make sure that the integral type is unsigned since the sign bit will repopulate its value and feed it to bit field from left. _____ https://en.m.wikipedia.org/wiki/Arithmetic_shift http://www.c-jump.com/CIS77/ASM/Flags/F77_0160_sar_instruction.htm
22nd Oct 2018, 5:36 PM
Babak
Babak - avatar
+ 1
C++ Soldier (Babak) Thanks and yes that's true, I was once also so confused of the use of the sign bit, that I had a hard time trying to write myself a decimal → binary converter for negative values, thankfully we have helpful friends in this community, that I now understand it a bit better : )
22nd Oct 2018, 4:48 PM
Ipang
+ 1
C++ Soldier (Babak) One nice tips that is, I'll keep that in my notes book, didn't do much bit shifting operations yet, might make a good practice for me : )
22nd Oct 2018, 5:49 PM
Ipang