Bổ sung là gì?


434

Tôi đang tham gia khóa học về hệ thống máy tính và đã phải vật lộn , một phần, với phần Bổ sung của Two . Tôi muốn hiểu nó nhưng tất cả mọi thứ tôi đã đọc đã không mang lại hình ảnh cho tôi. Tôi đã đọc bài viết trên wikipedia và nhiều bài viết khác, bao gồm cả sách giáo khoa của tôi .

Do đó, tôi muốn bắt đầu bài viết wiki cộng đồng này để xác định Bổ sung của Two là gì, cách sử dụng và cách nó có thể ảnh hưởng đến các con số trong các hoạt động như phôi (từ đã ký đến không dấu và ngược lại), hoạt động bit-bit và hoạt động dịch chuyển bit .

Điều tôi hy vọng là một định nghĩa rõ ràng và súc tích mà người lập trình dễ hiểu.

Câu trả lời:


627

Bổ sung của hai là một cách lưu trữ số nguyên thông minh để các bài toán phổ biến rất đơn giản để thực hiện.

Để hiểu, bạn phải nghĩ về các số trong nhị phân.

Về cơ bản nó nói,

  • cho số không, sử dụng tất cả 0.
  • đối với các số nguyên dương, bắt đầu đếm lên, với tối đa là 2 (số bit - 1) -1.
  • đối với các số nguyên âm, hãy thực hiện chính xác điều tương tự, nhưng chuyển đổi vai trò của 0 và 1 (vì vậy thay vì bắt đầu bằng 0000, hãy bắt đầu bằng 1111 - đó là phần "bổ sung").

Chúng ta hãy thử với một byte nhỏ gồm 4 bit (chúng ta sẽ gọi nó là nibble - 1/2 byte).

  • 0000 - số không
  • 0001 - một
  • 0010 - hai
  • 0011 - số ba
  • 0100đến 0111- bốn đến bảy

Đó là xa như chúng ta có thể đi trong tích cực. 2 3 -1 = 7.

Đối với tiêu cực:

  • 1111 - tiêu cực
  • 1110 - hai âm
  • 1101 - ba âm
  • 1100đến 1000- âm bốn đến âm tám

Lưu ý rằng bạn nhận được một giá trị bổ sung cho các phủ định ( 1000= -8) mà bạn không cho các giá trị dương. Điều này là do 0000được sử dụng cho số không. Đây có thể được coi là Số dòng máy tính.

Phân biệt giữa số dương và số âm

Làm điều này, bit đầu tiên có vai trò của bit "dấu", vì nó có thể được sử dụng để phân biệt giữa các giá trị thập phân không âm và âm. Nếu bit có ý nghĩa nhất là 1, thì nhị phân có thể được gọi là âm, trong đó nếu như bit đáng kể nhất (ngoài cùng bên trái) 0, bạn có thể nói giá trị thập phân là không âm.

Các số âm "bổ sung của một người" chỉ lật bit dấu, sau đó đếm từ 0. Nhưng cách tiếp cận này phải xử lý việc diễn giải 1000là "số 0 âm" gây nhầm lẫn. Bạn thường chỉ phải lo lắng về điều này khi làm việc gần với phần cứng.


146
Có lẽ phần tốt nhất của phần bù của hai là cách nó đơn giản hóa toán học. Hãy thử cộng 2 (0010) và -2 (1110) lại với nhau và bạn nhận được 10000. Bit đáng kể nhất là tràn, vì vậy kết quả thực sự là 0000. Gần giống như phép thuật, 2 + -2 = 0.
Naaff

96
Một ưu điểm khác bên cạnh việc cộng và trừ dễ dàng là phần bù 2s chỉ có một số không. Nếu bạn đang sử dụng một bit dấu đơn giản, giả sử sử dụng 0001 để biểu thị +1 và 1001 để biểu thị -1, bạn sẽ có hai số không: 0000 ("+0") và 1000 ("-0"). Đó là một nỗi đau thực sự ở phía sau.
Jörg W Mittag

26
Upvote cho nó đến điểm và cũng để giải thích tại sao các giá trị âm có phạm vi lớn hơn các giá trị dương. Tôi đã tìm kiếm lý do cho sự khác biệt phạm vi.
Ashwin

2
Bạn không nên nói "đối với các số nguyên âm, hãy thực hiện chính xác điều tương tự nhưng hãy đếm ngược và chuyển đổi vai trò của 0 và 1"
Koray Tugay

1
Tuyệt vời. Thêm các phần bổ sung của việc chuyển đổi bit thành số nguyên âm.
Suraj Jain

339

Tôi tự hỏi nếu nó có thể được giải thích tốt hơn so với bài viết Wikipedia.

Vấn đề cơ bản mà bạn đang cố gắng giải quyết với biểu diễn bổ sung của hai là vấn đề lưu trữ số nguyên âm.

Đầu tiên hãy xem xét một số nguyên không dấu được lưu trữ trong 4 bit. Bạn có thể có những điều sau đây

0000 = 0
0001 = 1
0010 = 2
...
1111 = 15

Đây là không dấu vì không có dấu hiệu cho thấy chúng là âm hay dương.

Ký hiệu cường độ và ký hiệu vượt quá

Để lưu trữ số âm, bạn có thể thử một số thứ. Đầu tiên, bạn có thể sử dụng ký hiệu cường độ ký hiệu gán bit đầu tiên làm bit dấu để biểu thị +/- và các bit còn lại để biểu thị cường độ. Vì vậy, sử dụng 4 bit một lần nữa và giả sử rằng 1 có nghĩa là - và 0 có nghĩa là + thì bạn có

0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7

Vì vậy, bạn thấy vấn đề ở đó? Chúng ta có dương và âm 0. Vấn đề lớn hơn là cộng và trừ các số nhị phân. Các mạch để cộng và trừ sử dụng cường độ dấu sẽ rất phức tạp.

Những gì là

0010
1001 +
----

?

Một hệ thống khác là ký hiệu thừa . Bạn có thể lưu trữ số âm, bạn thoát khỏi vấn đề hai số không nhưng phép cộng và phép trừ vẫn còn khó khăn.

Vì vậy, cùng đến hai bổ sung. Bây giờ bạn có thể lưu trữ số nguyên dương và âm và thực hiện số học một cách dễ dàng. Có một số phương pháp để chuyển đổi một số thành hai phần bù. Đây là một.

Chuyển đổi số thập phân thành bổ sung của hai

  1. Chuyển đổi số thành nhị phân (bỏ qua dấu hiệu bây giờ), ví dụ 5 là 0101 và -5 là 0101

  2. Nếu số là một số dương thì bạn đã hoàn thành. ví dụ 5 là 0101 trong nhị phân sử dụng ký hiệu bổ sung twos.

  3. Nếu số âm thì

    3,1 tìm phần bù (nghịch đảo 0 và 1), ví dụ -5 là 0101, vì vậy tìm phần bù là 1010

    3.2 Thêm 1 vào phần bù 1010 + 1 = 1011. Do đó, -5 trong phần bù của hai là 1011.

Vậy, nếu bạn muốn làm 2 + (-3) ở dạng nhị phân thì sao? 2 + (-3) là -1. Bạn sẽ phải làm gì nếu bạn đang sử dụng cường độ ký hiệu để thêm các số này? 0010 + 1101 =?

Sử dụng hai bổ sung xem xét nó sẽ dễ dàng như thế nào.

 2  =  0010
 -3 =  1101 +
 -------------
 -1 =  1111

Chuyển đổi bổ sung của hai thành số thập phân

Chuyển đổi 1111 sang thập phân:

  1. Số bắt đầu bằng 1, vì vậy nó âm, vì vậy chúng tôi tìm thấy phần bù của 1111, là 0000.

  2. Thêm 1 đến 0000 và chúng tôi có được 0001.

  3. Chuyển đổi 0001 thành số thập phân, là 1.

  4. Áp dụng dấu = -1.

Tada!


45
Câu trả lời tốt nhất theo ý kiến ​​của tôi.
Koray Tugay

5
vâng, cái này khá đơn giản và giải thích vấn đề rất tốt
Max Koretskyi

3
Tôi không hiểu cách thêm một khi chuyển đổi cả hai cách luôn dẫn đến cùng một số. Trong tâm trí của tôi, bạn sẽ đảo ngược các bước, hoặc trừ đi một hoặc một cái gì đó.
Marcos Pereira

2
Tại sao thêm 1 vào phần bù?
Zinan Xing

4
Câu trả lời này nên được sử dụng trên Wikipedia.
Hiroki

119

Giống như hầu hết các giải thích tôi đã thấy, những điều trên đây rõ ràng về cách làm việc với phần bù 2, nhưng không thực sự giải thích chúng gì về mặt toán học. Tôi sẽ cố gắng làm điều đó, ít nhất là cho các số nguyên, và tôi sẽ trình bày một số nền có lẽ quen thuộc trước tiên.

Nhớ lại cách nó hoạt động cho số thập phân:
  2345
là cách viết
  2 × 10 3 + 3 × 10 2 + 4 × 10 1 + 5 × 10 0 .

Theo cùng một cách, nhị phân là cách viết số chỉ sử dụng 01 theo cùng một ý tưởng chung, nhưng thay thế 10 số trên bằng 2 giây. Sau đó, trong nhị phân,
  1111
là cách viết
  1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0
và nếu bạn làm việc đó, hóa ra là bằng 15 (cơ sở 10). Đó là bởi vì nó là
  8 + 4 + 2 + 1 = 15.

Đây là tất cả tốt và tốt cho số dương. Nó thậm chí hoạt động cho các số âm nếu bạn sẵn sàng chỉ dán một dấu trừ trước mặt chúng, như con người làm với các số thập phân. Điều đó thậm chí có thể được thực hiện trong máy tính, nhưng tôi đã không thấy một chiếc máy tính như vậy từ đầu những năm 1970. Tôi sẽ để lại lý do cho một cuộc thảo luận khác.

Đối với máy tính, nó trở nên hiệu quả hơn khi sử dụng phần biểu diễn cho số âm. Và đây là một cái gì đó thường bị bỏ qua. Các ký hiệu bổ sung liên quan đến một số loại đảo ngược các chữ số của số, thậm chí các số không ngụ ý xuất hiện trước một số dương bình thường. Điều đó thật khó xử, bởi vì câu hỏi được đặt ra: tất cả chúng? Đó có thể là một số lượng vô hạn các chữ số được xem xét.

May mắn thay, máy tính không đại diện cho vô số. Các số bị ràng buộc với một chiều dài cụ thể (hoặc chiều rộng, nếu bạn thích). Vì vậy, hãy trở lại số nhị phân dương, nhưng với một kích thước cụ thể. Tôi sẽ sử dụng 8 chữ số ("bit") cho các ví dụ này. Vì vậy, số nhị phân của chúng tôi thực sự sẽ là
  00001111
hoặc
  0 × 2 7 + 0 × 2 6 + 0 × 2 5 + 0 × 2 4 + 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0

Để tạo thành phần bù âm của 2, trước tiên, chúng tôi bổ sung tất cả các chữ số (nhị phân) để tạo thành
  11110000
và thêm 1 vào mẫu
  11110001
nhưng làm thế nào để chúng ta hiểu điều đó có nghĩa là -15?

Câu trả lời là chúng ta thay đổi ý nghĩa của bit thứ tự cao (cái ngoài cùng bên trái). Bit này sẽ là 1 cho tất cả các số âm. Thay đổi sẽ là thay đổi dấu hiệu đóng góp của nó thành giá trị của số mà nó xuất hiện. Vì vậy, bây giờ 11110001 của chúng tôi được hiểu là đại diện
  - 1 × 2 7 + 1 × 2 6 + 1 × 2 5 + 1 × 2 4 + 0 × 2 3 + 0 × 2 2 + 0 × 2 1 + 1 × 2 0
Lưu ý rằng "-" trước biểu thức đó? Nó có nghĩa là bit dấu mang trọng lượng -2 7 , nghĩa là -128 (cơ sở 10). Tất cả các vị trí khác giữ nguyên trọng số họ có trong số nhị phân không dấu.

Làm việc -15 của chúng tôi, đó là
  -128 + 64 + 32 + 16 + 1
Hãy thử trên máy tính của bạn. đó là -15.

Trong ba cách chính mà tôi đã thấy các số âm được biểu thị trong máy tính, phần bổ sung của 2 sẽ giúp bạn thuận tiện trong sử dụng chung. Nó có một sự kỳ lạ, mặc dù. Vì nó là nhị phân, nên phải có một số chẵn các kết hợp bit có thể. Mỗi số dương có thể được ghép với số âm của nó, nhưng chỉ có một số không. Phủ định số 0 giúp bạn bằng không. Vì vậy, có thêm một kết hợp, số có 1 trong bit dấu và 0 ở mọi nơi khác. Số dương tương ứng sẽ không phù hợp với số lượng bit được sử dụng.

Điều kỳ lạ hơn nữa về con số này là nếu bạn cố gắng hình thành số dương của nó bằng cách bổ sung và thêm một số, bạn sẽ nhận lại số âm tương tự. Có vẻ tự nhiên là số 0 sẽ làm điều này, nhưng điều này thật bất ngờ và hoàn toàn không phải là hành vi mà chúng ta đã từng sử dụng vì máy tính sang một bên, chúng ta thường nghĩ đến việc cung cấp không giới hạn các chữ số, không phải là số học có độ dài cố định này.

Đây giống như đỉnh của một tảng băng kỳ lạ. Có nhiều lời nói dối chờ đợi bên dưới bề mặt, nhưng thế là đủ cho cuộc thảo luận này. Bạn có thể có thể tìm thấy nhiều hơn nếu bạn nghiên cứu "tràn" cho số học điểm cố định. Nếu bạn thực sự muốn tham gia vào nó, bạn cũng có thể nghiên cứu "số học mô-đun".


1
Tôi thích câu trả lời này! Giải thích cách lấy 2s bổ sung và thêm một hoạt động.
SJ.

Tôi thích câu trả lời này là tốt. Đặc biệt là nơi bạn chỉ ra cách số âm được tìm ra. Ở đây tôi nghĩ rằng toàn bộ số đã được đảo ngược, không chỉ MSB và sau đó thêm lại các giá trị trọng số khác. Cảm ơn bạn, điều này đã giải quyết khối não của tôi
user188757

Tốt công việc đề cập đến số lẻ mà không có nghịch đảo. Nhưng chúng ta làm gì về điều này? Có phải chúng ta chỉ đặt cờ tràn nếu ai đó cố gắng đảo ngược nó?
NH.

Trong khi các câu trả lời khác tập trung vào "làm thế nào", câu trả lời này dẫn chúng ta nhẹ nhàng với "tại sao". Nó đã giúp đỡ tôi. Cảm ơn!
Abhishek Pathak

Nếu một số kết thúc bằng 11000 ... 000, đảo ngược nó sẽ mang lại 01000 ... 000. Ký hiệu bổ sung của hai dựa trên ý tưởng rằng tất cả các chữ số ở bên trái của chữ số được biểu diễn ngoài cùng bên trái sẽ có cùng giá trị với chữ số đó, nhưng khi đảo ngược một số có đại diện là 1000 ... 000, điều đó sẽ không đúng.
supercat

20

Bổ sung của 2 rất hữu ích cho việc tìm giá trị của nhị phân, tuy nhiên tôi nghĩ ra một cách giải quyết vấn đề ngắn gọn hơn nhiều (chưa từng thấy ai xuất bản nó):

lấy một nhị phân, ví dụ: 1101, [giả sử rằng không gian "1" là dấu hiệu] bằng -3 .

sử dụng phần bù 2 của chúng ta sẽ làm điều này ... lật 1101 đến 0010 ... thêm 0001 + 0010 ===> cho chúng ta 0011. 0011 trong nhị phân dương = 3. do đó 1101 = -3 !

Những gì tôi nhận ra:

thay vì lật và thêm, bạn chỉ có thể thực hiện phương pháp cơ bản để giải cho nhị phân dương (giả sử 0101) là (2 3 * 0) + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = 5.

Thực hiện chính xác cùng một khái niệm với một tiêu cực! (Với một twist nhỏ)

lấy 1101, ví dụ:

cho số đầu tiên thay vì 2 3 * 1 = 8 , do - (2 3 * 1) = -8 .

sau đó tiếp tục như bình thường, làm -8 + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = -3


1
Cách tốt nhất, tôi có thể hiểu bổ sung của 2. Sau khi đọc nó, tôi có thể hiểu tất cả các câu trả lời cho câu hỏi trên.
Shakeel Shahzad

1
Đây là phương pháp được đề cập trong cuốn sách Hệ thống máy tính: Quan điểm của lập trình viên.
jimo

1
Đây là một cách nhanh hơn nhiều!
chanzerre

14

Hãy tưởng tượng rằng bạn có số bit / trits / chữ số / số hữu hạn. Bạn xác định 0 là tất cả các chữ số là 0 và đếm ngược lên một cách tự nhiên:

00
01
02
..

Cuối cùng, bạn sẽ tràn.

98
99
00

Chúng tôi có hai chữ số và có thể đại diện cho tất cả các số từ 0 đến 100. Tất cả những số đó là dương! Giả sử chúng ta cũng muốn đại diện cho số âm?

Những gì chúng ta thực sự có là một chu kỳ. Số trước 2 là 1. Số trước 1 là 0. Số trước 0 là ... 99 .

Vì vậy, để đơn giản, hãy nói rằng bất kỳ số nào trên 50 là âm. "0" đến "49" đại diện cho 0 đến 49. "99" là -1, "98" là -2, ... "50" là -50.

Đại diện này là bổ sung mười . Máy tính thường sử dụng phần bù hai , giống nhau ngoại trừ sử dụng bit thay vì chữ số.

Điều tốt đẹp về sự bổ sung của mười là bổ sung chỉ hoạt động . Bạn không cần phải làm gì đặc biệt để thêm số dương và số âm!


9

Tôi đã đọc một lời giải thích tuyệt vời trên Reddit bởi jng, sử dụng máy đo đường như một sự tương tự.

nhập mô tả hình ảnh ở đây

Đó là một quy ước hữu ích. Các mạch và hoạt động logic tương tự cộng / trừ các số dương trong nhị phân vẫn hoạt động trên cả số dương và số âm nếu sử dụng quy ước, đó là lý do tại sao nó rất hữu ích và có mặt khắp nơi.

Hãy tưởng tượng đồng hồ đo đường của một chiếc ô tô, nó lăn xung quanh tại (giả sử) 99999. Nếu bạn tăng 00000, bạn nhận được 00001. Nếu bạn giảm 00000, bạn nhận được 99999 (do cuộn quanh). Nếu bạn thêm một trở lại 99999, nó sẽ quay trở lại 00000. Vì vậy, thật hữu ích khi quyết định 99999 đại diện cho -1. Tương tự như vậy, rất hữu ích khi quyết định 99998 đại diện cho -2, v.v. Bạn phải dừng lại ở đâu đó, và cũng theo quy ước, nửa trên của các số được coi là âm (50000-99999), và nửa dưới dương chỉ đứng cho chính chúng (00000-49999). Kết quả là, chữ số trên cùng là 5-9 có nghĩa là số đại diện là âm và nó là 0-4 có nghĩa là số đại diện là dương - chính xác giống như dấu bit đại diện trên cùng trong số nhị phân bổ sung của hai.

Hiểu điều này cũng khó với tôi. Khi tôi đã nhận được nó và quay lại để đọc lại các bài báo và giải thích về sách (lúc đó không có internet), hóa ra rất nhiều người mô tả nó không thực sự hiểu nó. Tôi đã viết một cuốn sách giảng dạy ngôn ngữ lắp ráp sau đó (đã bán khá tốt trong 10 năm).


5

Hai phần bù được tìm ra bằng cách thêm phần bù 1 đến 1 của số đã cho. Hãy nói rằng chúng ta phải tìm ra twos bổ sung 10101sau đó tìm phần bổ sung của nó, nghĩa là 01010thêm 1vào kết quả này, nghĩa là 01010+1=01011, đó là câu trả lời cuối cùng.


4

Cho phép nhận câu trả lời 10 - 12 ở dạng nhị phân bằng 8 bit: Điều chúng ta thực sự sẽ làm là 10 + (-12)

Chúng ta cần lấy phần khen của 12 để trừ nó từ 10. 12 trong nhị phân là 00001100. 10 trong nhị phân là 00001010.

Để có được phần khen của 12, chúng ta chỉ cần đảo ngược tất cả các bit sau đó thêm 1. 12 trong đảo ngược nhị phân là 11110011. Đây cũng là mã nghịch đảo (phần bù của một). Bây giờ chúng ta cần thêm một, bây giờ là 11110100.

Vậy 11110100 là lời khen của 12! Dễ dàng khi bạn nghĩ về nó theo cách này.

Bây giờ bạn có thể giải câu hỏi trên 10-12 ở dạng nhị phân.

00001010
11110100
-----------------
11111110  

3

Phần bổ sung của 2: Khi chúng tôi thêm một phần bổ sung với phần bổ sung của 1 số, chúng tôi sẽ nhận được phần bổ sung của 2. Ví dụ: 100101, phần bù 1 của nó là 011010 và phần bù của 2 là 011010 + 1 = 011011 (Bằng cách thêm phần bổ sung với phần 1) Để biết thêm thông tin , bài viết này giải thích bằng đồ họa.


plus1 cho liên kết có lời giải thích với vòng tròn
Manohar Reddy Poreddy

3

Nhìn vào hệ thống bổ sung của hai từ quan điểm toán học, nó thực sự có ý nghĩa. Trong phần bổ sung của mười, ý tưởng chủ yếu là 'cô lập' sự khác biệt.

Ví dụ: 63 - 24 = x

Chúng tôi thêm phần bổ sung của 24, thực sự chỉ là (100 - 24). Vì vậy, thực sự, tất cả những gì chúng ta đang làm là thêm 100 vào cả hai mặt của phương trình.

Bây giờ phương trình là: 100 + 63 - 24 = x + 100, đó là lý do tại sao chúng tôi loại bỏ 100 (hoặc 10 hoặc 1000 hoặc bất cứ điều gì).

Do tình huống bất tiện khi phải trừ một số từ một chuỗi số 0 dài, chúng tôi sử dụng hệ thống 'bổ sung cơ số giảm dần', trong hệ thập phân, bổ sung chín.

Khi chúng ta được trình bày với một số bị trừ từ một chuỗi số lớn, chúng ta chỉ cần đảo ngược các số.

Ví dụ: 99999 - 03275 = 96724

Đó là lý do, sau phần bổ sung của chín, chúng tôi thêm 1. Như bạn có thể biết từ toán học thời thơ ấu, 9 trở thành 10 bằng cách 'ăn cắp' 1. Vì vậy, về cơ bản, đó chỉ là phần bổ sung mười lấy 1 từ sự khác biệt.

Trong Nhị phân, phần bù của hai tương đương với phần bù của mười, trong khi phần bù của phần bù cho phần bù của phần chín. Sự khác biệt chính là thay vì cố gắng cô lập sự khác biệt với lũy thừa mười (thêm 10, 100, v.v. vào phương trình), chúng tôi đang cố gắng cô lập sự khác biệt với quyền hạn của hai.

Đó là vì lý do này mà chúng tôi đảo ngược các bit. Giống như cách minuend của chúng tôi là một chuỗi số thập phân, thập phân của chúng tôi là một chuỗi các nhị phân.

Ví dụ: 111111 - 101001 = 010110

Bởi vì chuỗi của những người dưới 1 dưới một sức mạnh tốt đẹp của hai, họ 'đánh cắp' 1 từ sự khác biệt như chín làm theo số thập phân.

Khi chúng tôi đang sử dụng số nhị phân âm, chúng tôi thực sự chỉ nói:

0000 - 0101 = x

1111 - 0101 = 1010

1111 + 0000 - 0101 = x + 1111

Để 'cô lập' x, chúng tôi cần thêm 1 vì 1111 cách xa 10000 và chúng tôi xóa số 1 vì chúng tôi chỉ thêm nó vào chênh lệch ban đầu.

1111 + 1 + 0000 - 0101 = x + 1111 + 1

10000 + 0000 - 0101 = x + 10000

Chỉ cần loại bỏ 10000 từ cả hai phía để có x, đó là đại số cơ bản.


3

Nhiều câu trả lời cho đến nay giải thích rõ ràng lý do tại sao phần bù hai được sử dụng để biểu thị số âm, nhưng không cho chúng tôi biết số bổ sung của hai là gì, đặc biệt không phải là tại sao số '1' được thêm vào và thực tế thường được thêm vào sai cách.

Sự nhầm lẫn xuất phát từ một sự hiểu biết kém về định nghĩa của một số bổ sung. Một bổ sung là phần còn thiếu sẽ làm cho một cái gì đó hoàn thành.

Bổ sung cơ số của một số n chữ số x trong cơ số b, theo định nghĩa, b ^ nx. Trong nhị phân 4 được biểu thị bằng 100, có 3 chữ số (n = 3) và cơ số là 2 (b = 2). Vì vậy, bổ sung cơ số của nó là b ^ nx = 2 ^ 3-4 = 8-4 = 4 (hoặc 100 ở dạng nhị phân).

Tuy nhiên, trong nhị phân có được phần bù của cơ số không dễ như lấy phần bổ sung cơ số giảm dần, được định nghĩa là (b ^ n-1) -y, chỉ bằng 1 so với phần bổ sung của cơ số. Để có được bổ sung cơ số giảm dần, bạn chỉ cần lật tất cả các chữ số.

100 -> 011 (giảm dần (một) bổ sung cơ số)

để có được bổ sung cơ số (hai), chúng ta chỉ cần thêm 1, như định nghĩa đã định nghĩa.

011 +1 -> 100 (bổ sung hai).

Bây giờ với sự hiểu biết mới này, chúng ta hãy xem ví dụ được đưa ra bởi Vincent Ramdhanie (xem phản hồi thứ hai ở trên)

/ * bắt đầu của Vincent

Chuyển đổi 1111 sang thập phân:

Số bắt đầu bằng 1, vì vậy nó âm, vì vậy chúng tôi tìm thấy phần bù của 1111, là 0000. Thêm 1 thành 0000 và chúng tôi nhận được 0001. Chuyển đổi 0001 thành số thập phân, là 1. Áp dụng dấu = -1. Tada!

kết thúc Vincent * /

Nên hiểu là

Số bắt đầu bằng 1, vì vậy nó âm. Vì vậy, chúng ta biết nó là phần bù hai của một số giá trị x. Để tìm x đại diện bởi phần bù hai của nó, trước tiên chúng ta cần tìm phần bù 1 của nó.

phần bù hai của x: 1111 phần bù của x: 1111-1 -> 1110; x = 0001, (lật tất cả các chữ số)

áp dụng dấu - và câu trả lời = -x = -1.


3

Bổ sung từ xuất phát từ sự đầy đủ. Trong thế giới thập phân, các chữ số từ 0 đến 9 cung cấp phần (bộ hoàn chỉnh) các chữ số hoặc ký hiệu số để thể hiện tất cả các số thập phân. Trong thế giới nhị phân, các số 0 và 1 cung cấp bổ sung cho các số để thể hiện tất cả các số nhị phân. Trong thực tế, các ký hiệu 0 và 1 phải được sử dụng để thể hiện mọi thứ (văn bản, hình ảnh, v.v.) cũng như dương (0) và âm (1). Trong thế giới của chúng ta, khoảng trống ở bên trái của số được coi là 0:

                  35=035=000000035.

Trong một vị trí lưu trữ máy tính không có không gian trống. Tất cả các bit (chữ số nhị phân) phải là 0 hoặc 1. Để sử dụng hiệu quả số bộ nhớ có thể được lưu trữ dưới dạng biểu diễn 8 bit, 16 bit, 32 bit, 64 bit, 128 bit. Khi một số được lưu dưới dạng số 8 bit được chuyển đến vị trí 16 bit, dấu và độ lớn (giá trị tuyệt đối) phải giữ nguyên. Cả hai đại diện bổ sung của 1 và 2 đại diện cho điều này. Như một danh từ: Cả phần bù 1 và phần bù 2 là biểu diễn nhị phân của các đại lượng đã ký trong đó bit quan trọng nhất (phần bên trái) là bit dấu. 0 là cho dương và 1 là âm. Bổ sung 2s không có nghĩa là tiêu cực. Nó có nghĩa là một số lượng đã ký. Như trong thập phân, cường độ được biểu diễn dưới dạng đại lượng dương. Cấu trúc sử dụng phần mở rộng dấu để bảo toàn số lượng khi quảng cáo lên thanh ghi [] với nhiều bit hơn:

       [0101]=[00101]=[00000000000101]=5 (base 10)
       [1011]=[11011]=[11111111111011]=-5(base 10)

Như một động từ: bổ sung của 2 có nghĩa là phủ định . Nó không có nghĩa là làm cho tiêu cực. Nó có nghĩa là nếu tiêu cực làm cho tích cực; nếu tích cực làm tiêu cực. Độ lớn là giá trị tuyệt đối:

        if a >= 0 then |a| = a
        if a < 0 then |a| = -a = 2scomplement of a

Khả năng này cho phép trừ nhị phân hiệu quả bằng cách sử dụng phủ định sau đó thêm. a - b = a + (-b)

Cách chính thức để lấy phần bù 1 là cho mỗi chữ số trừ đi giá trị của nó từ 1.

        1'scomp(0101) = 1010.

Điều này giống như lật hoặc đảo ngược từng bit riêng lẻ. Điều này dẫn đến một số 0 âm không được yêu thích tốt vì vậy việc thêm một vào phần bổ sung của te 1 sẽ thoát khỏi vấn đề. Để phủ định hoặc lấy phần bù 2s trước tiên hãy lấy phần bù 1s sau đó thêm 1.

        Example 1                             Example 2
         0101  --original number              1101
         1's comp  1010                       0010
         add 1     0001                       0001
         2's comp  1011  --negated number     0011

Trong các ví dụ, phủ định cũng hoạt động với các số mở rộng ký.

Thêm:
1110 Carry 111110 Carry 0110 giống với 000110 1111 111111 sum 0101 sum 000101

Hấp dẫn:

    1110  Carry                      00000   Carry
     0110          is the same as     00110
    -0111                            +11001
  ----------                        ----------
sum  0101                       sum   11111

Lưu ý rằng khi làm việc với phần bù 2, khoảng trống ở bên trái của số được điền bằng số 0 cho số dương nhưng phần này chứa đầy số cho số âm. Việc mang theo luôn được thêm vào và phải là 1 hoặc 0.

Chúc mừng


3

Bổ sung của 2 về cơ bản là một cách đến với nghịch đảo cộng gộp của một số nhị phân. Hãy tự hỏi mình điều này: Cho một số ở dạng nhị phân, mẫu bit nào, khi được thêm vào số ban đầu, sẽ làm cho kết quả bằng không? Nếu bạn có thể đưa ra mẫu bit này thì mẫu bit đó là biểu diễn -ve (nghịch đảo cộng gộp) của số gốc; theo định nghĩa, việc thêm một số vào nghịch đảo cộng gộp của nó sẽ luôn luôn dẫn đến không. Ví dụ: lấy 101, là số thập phân 5. Bây giờ nhiệm vụ là đưa ra một mẫu bit mà khi thêm vào mẫu bit đã cho (101) sẽ dẫn đến không. Để làm điều đó, hãy bắt đầu từ bit phải của 101 và cho mỗi bit riêng lẻ, một lần nữa đặt câu hỏi tương tự: Tôi nên thêm bit nào vào bit "này" để làm cho kết quả bằng 0? tiếp tục làm điều đó có tính đến việc mang thông thường. Sau khi chúng ta thực hiện với 3 vị trí đúng nhất (các chữ số xác định số gốc mà không liên quan đến các số 0 đứng đầu), lần thực hiện cuối cùng đi theo mô hình bit của nghịch đảo phụ gia. Hơn nữa, vì chúng ta có thể giữ số gốc bằng một byte đơn, tất cả các bit hàng đầu khác trong nghịch đảo phụ gia cũng phải là 1 để khi máy tính thêm số và nghịch đảo phụ của nó bằng cách sử dụng loại lưu trữ "đó" (char) kết quả trong char đó sẽ là tất cả số không.

 1 1 1
 ----------
   1 0 1
 1 0 1 1 ---> additive inverse
  ---------
   0 0 0

2

Tôi thích câu trả lời của lavinio, nhưng các bit dịch chuyển thêm một số phức tạp. Thường có sự lựa chọn các bit di chuyển trong khi tôn trọng bit dấu hoặc trong khi không tôn trọng bit dấu. Đây là lựa chọn giữa việc xử lý các số như đã ký (-8 đến 7 cho một nibble, -128 đến 127 cho byte) hoặc các số không dấu toàn dải (0 đến 15 cho nibble, 0 đến 255 cho byte).


2

Đây là một phương tiện thông minh để mã hóa các số nguyên âm theo cách mà khoảng một nửa số bit kết hợp của loại dữ liệu được dành riêng cho các số nguyên âm và việc thêm hầu hết các số nguyên âm với các số nguyên dương tương ứng của chúng sẽ dẫn đến tràn khiến kết quả là số không nhị phân.

Vì vậy, trong phần bù của 2 nếu một là 0x0001 thì -1 là 0x1111, vì điều đó sẽ dẫn đến tổng cộng là 0x0000 (với mức tràn là 1).


1

Tôi đã có cùng một vấn đề một vài tuần trước đây. Cuối cùng tôi đã đọc về nó trực tuyến từ nhiều nguồn khác nhau, cố gắng ghép các mảnh lại với nhau và tự viết về nó để đảm bảo rằng tôi hiểu chính xác. Chúng tôi sử dụng hai bổ sung cho chủ yếu hai lý do:

  1. Để tránh nhiều đại diện của 0
  2. Để tránh theo dõi bit mang (như bổ sung của một người) trong trường hợp tràn.
  3. Thực hiện các hoạt động đơn giản như cộng và trừ trở nên dễ dàng.

Nếu bạn muốn có một lời giải thích chi tiết hơn về vấn đề này, hãy thử bài viết được viết bởi tôi ở đây . Hy vọng nó giúp!


1

Phần bù hai là một trong những cách thể hiện số âm và hầu hết các bộ điều khiển và bộ xử lý lưu trữ số âm ở dạng bổ sung của 2


1
Điều này không thêm bất cứ điều gì vào thông tin được cung cấp bởi các câu trả lời khác.
Adrian Mole

0

TÀI LIỆU THAM KHẢO: https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html

Tôi đảo ngược tất cả các bit và thêm 1. Lập trình:

  // in C++11
  int _powers[] = {
      1,
      2,
      4,
      8,
      16,
      32,
      64,
      128
  };

  int value=3;
  int n_bits=4;
  int twos_complement = (value ^ ( _powers[n_bits]-1)) + 1;

Ngay cả trình biên dịch sẽ là mức quá cao. Cần phải xem một sơ đồ mức cổng của logic bổ sung. Với chu kỳ T. Bạn đúng thuật toán.
mckenzm

0

Bổ sung 2 của một số đã cho là không. có được bằng cách thêm 1 với phần bù 1 của số không. giả sử, chúng ta có số nhị phân: 10111001101 Phần bù của 1 là: 01000110010 Và phần bù của 2 sẽ là: 01000110011


0

Để bổ sung bitwise một số là lật tất cả các bit trong đó. Để bổ sung cho hai, chúng ta lật tất cả các bit và thêm một bit.

Sử dụng biểu diễn phần bù của 2 cho các số nguyên đã ký, chúng tôi áp dụng phép toán bù của 2 để chuyển đổi một số dương thành tương đương âm của nó và ngược lại. Vì vậy, sử dụng nibble cho một ví dụ, 0001(1) trở thành 1111(-1) và áp dụng lại op, quay trở lại 0001.

Hành vi của hoạt động ở mức 0 là thuận lợi trong việc đưa ra một đại diện duy nhất cho số 0 mà không xử lý đặc biệt các số 0 dương và âm. 0000bổ sung 1111, khi 1 được thêm vào. tràn ra 0000, cho chúng ta một con số không, thay vì tích cực và tiêu cực.

Một lợi thế chính của biểu diễn này là các mạch bổ sung tiêu chuẩn cho các số nguyên không dấu tạo ra kết quả chính xác khi áp dụng cho chúng. Ví dụ: thêm 1 và -1 trong nibble : 0001 + 1111, các bit tràn ra khỏi thanh ghi, bỏ lại phía sau0000 .

Để giới thiệu nhẹ nhàng, Computerphile tuyệt vời đã sản xuất một video về chủ đề này .


0

Nói 2's Complementmột cách đơn giản là cách lưu trữ số âm trong Bộ nhớ máy tính. Trong khi đó Số dương được lưu trữ dưới dạng Số nhị phân thông thường.

Hãy xem xét ví dụ này,

Máy tính sử dụng Binary Number Systemđể đại diện cho bất kỳ số nào.

x = 5;

Điều này được thể hiện như 0101.

x = -5;

Khi máy tính mã hóa -ký, nó sẽ tính toán bổ sung cho 2 và lưu trữ. i.e5 = 0101 và bổ sung của nó là 21011 .

Các quy tắc quan trọng mà máy tính sử dụng để xử lý số là

  1. Nếu bit đầu tiên 1thì nó phải là negativesố.
  2. Nếu tất cả các bit ngoại trừ bit đầu tiên 0thì đó là số dương vì không có -0hệ thống số. ( 1000 is not -0Thay vào đó là số dương 8)
  3. Nếu tất cả các bit là 00.
  4. Khác nó là một positive number.


-6

Câu trả lời đơn giản nhất:

1111 + 1 = (1) 0000. Vậy 1111 phải là -1. Khi đó -1 + 1 = 0.

Thật hoàn hảo để hiểu tất cả những điều này cho tôi.


Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ.
Codor

Đó là câu trả lời. Điều đơn giản nhất. Đối với tôi - người tốt nhất.
Dmitry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.