Toán tử trên bit : cái ~(not)
ví dụ như
int a=3;
printf("%d",~a);
mình biết a là 011 nhưng không biết tại sao ~a ra -4
Toán tử trên bit : cái ~(not)
ví dụ như
int a=3;
printf("%d",~a);
mình biết a là 011 nhưng không biết tại sao ~a ra -4
Dễ hình dung nhất là ntn:
...(1)111 =-1
trừ đi 3 sẽ thành
...(1)100 = -4
đảo lại bit sẽ thành
...(0)011 = 3
ổn rồi.
int a = 3 (32 bits)
=> a= 0b 0000 … 0000 0011
~a= 0b 1111 1111 1100 = -2^31 + 2^30 + 2^29 + … + 2^2 = -4
hoặc nhìn vào 4 bits cuối cho dễ tính nhẩm
a = 0b0011
~a = 0b1100 => ~a = -2³ + 2² = -8 + 4 = -4 (2er complement, bit đầu tiên luôn mang dấu trừ)
E k hiểu của a ạ. vì …111 =-1 từ đầu e vẫn chưa biết chuyển khi kqua là số âm
Vì ...(0)000 = 0
nên trừ 1 sẽ ra ...(1)111 = -1 thôi 
Thật ra cách biểu diễn này rất tự nhiên, thay vì cách cũ rất… trời ơi như sau:
...(0)000 = +0
...(1)111 = -0
định nghĩa bù 2 là ~x + 1 = -x :V Vậy suy ra ~x = -x - 1
thế x = 3 thì ~3 = -3 - 1 = -4 :V
bù 2 nó muốn (x) + (-x) = 0, bất kể bao nhiêu bit đi nữa. Vì ~x + x = 1111…111, chỉ cần + 1 thêm là nó tràn bit thành 0000…000 = 0, vậy ta có ~x + x + 1 = 0, hay -x = ~x + 1 :V
chắc e theo cách thanhtungphan. Vì cách a rogp10 và tntxtnt e chưa load được
computer organization là môn yêu thích của mình nên để mình viết cái wall of text cố gắng giải thích cho bạn
làm sao để biểu diễn số âm với hệ nhị phân
1er complement: -x = ~x
ví dụ -5 = ~5 = ~ 0b 0101 = 0b 1010
uhm thử thực hiện vài phép toán xem định nghĩa này có dùng dc ko
0b 1011 (-4)
+ 0b 0011 (3)
= 0b 1110 (-1)
thử thêm vài cái cho chắc ăn
0b 1011 (-4)
+ 0b 0110 (6)
= 0b 0001 (1)
-4 + 6 = 1 hmmm
định nghĩa số âm khác
2er complement: -x = ~x + 1
ví dụ: -5 = ~5 + 1 = ~0b0101 + 1 = 0b1010 + 1 = 0b1011
từ cái định nghĩa của 2er complement
-x = ~x +1 => -x - 1 = ~x
=> ~3 = -3 -1 = -4
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?