Toán tử not trên bit: Tại sao not 3 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.

5 Likes

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ừ)

3 Likes

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

...(0)000 = 0
nên trừ 1 sẽ ra ...(1)111 = -1 thôi :slight_smile:

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

3 Likes

đị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

5 Likes

chắc e theo cách thanhtungphan. Vì cách a rogp10 và tntxtnt e chưa load được

1 Like

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
6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?