kiểm tra xem một số nhị phân không dấu có chia hết cho 15 không


7

Tôi là một sinh viên khoa học máy tính và tôi đã bị mắc kẹt trong câu hỏi này hàng giờ.

Chúng ta có số X không dấu nhị phân, được biểu thị bằng 12 bit. Chúng tôi muốn xây dựng một hệ thống có đầu ra 1 bit - Y, đó sẽ là '1' nếu X được chia cho 15 mà không có phần dư.

Các thành phần duy nhất chúng ta có thể sử dụng là:

  • Bộ cộng 4 bit, cũng có C0 (mang theo) làm đầu vào và C4 là đầu ra.
  • 1 cổng NOR duy nhất với 3 đầu vào.

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

Tôi đã tìm thấy một mô hình. Nếu tôi tính 2 ^ i% 15 cho 0 <= i <= 11 (vì nó là 12 bit), thì tôi sẽ nhận được một chuỗi 1248 1248 1248.

Và nếu tôi có 0001 1110 1111 thì tôi có thể chỉ cần nhân tất cả các chữ số, tính tổng chúng và kiểm tra xem số của tôi có chia hết cho 15 không.

0 + 0 + 0 + 8 + 1 + 2 + 4 + 0 + 1 + 2 + 4 + 8 = 30

Vấn đề là, tôi không biết làm thế nào để thực hiện nó, và nếu nó thậm chí còn hiệu quả.

Tôi rất thích sự giúp đỡ.


Bạn có thể chỉ sử dụng một bộ cộng 4 bit và một cổng NOR duy nhất không? Hoặc bạn có thể sử dụng bộ cộng / cổng NOR không?
marcelm

Xem StackOverflow . Đừng bận tâm đến con số chính xác ở đó, tôi giải thích lý thuyết
MSalters

Câu trả lời:


19

Bạn có biết cách kiểm tra mức chia hết cho 9 trong cơ sở 10 không?

Thêm tất cả các chữ số bằng số học cơ sở 10. Nếu kết quả có nhiều chữ số, lặp lại quá trình. Dừng lại khi bạn có một chữ số. Nếu chữ số là 9, số ban đầu chia hết cho 9. Điều này hoạt động vì số chia đang được kiểm tra là cơ số 1. Ví dụ 45 chia hết cho 9 và các chữ số tổng hợp thành 9, chỉ cần một bộ cộng cho hai chữ số. 999 cũng vậy, hai bộ cộng là cần thiết cho ba chữ số.

Vì vậy, bây giờ bạn có một gợi ý về cách kiểm tra tính phân chia cho 15 khi bạn có 16 cơ sở số học cơ sở trong tay?


Đúng. Tôi hiểu tại sao, nhưng làm cách nào tôi có thể thực hiện "dừng khi bạn có một chữ số"?
sheldonzy

2
@sheldonzy, bạn chỉ bắt đầu với 3 chữ số hex nên bạn sẽ không cần nhiều hơn 2 lần bổ sung. ... Và thêm 0 cũng giống như không thực hiện phép cộng thứ 2.
Photon

Tôi đã thêm một câu trả lời đầy đủ với một bản vẽ, dựa trên câu trả lời của bạn. Cảm ơn :)
sheldonzy

4

Kỹ thuật này tương tự như những gì bạn sẽ làm để kiểm tra xem một số có chia hết cho 9 theo số thập phân hay không. Chúng ta cần chia số thành bốn chữ số bit và sau đó cộng các chữ số lại với nhau cho đến khi chúng ta còn lại một chữ số.

Hãy gọi các chữ số XYZ

c1,r1 = X + Y
c2,r2 = Z + r1 + c1
c3,r3 = r2 + 1

NẾU X, Y, Z chia hết cho 15 thì c2, r2 cũng chia hết cho 15. Ngoài ra c2, r2 nhỏ hơn 0x1e. Vì vậy, nếu r = 15 thì số ban đầu chia hết cho 15. Chúng tôi kiểm tra xem r có bằng 15 không bằng cách thêm một và nhìn vào cờ mang kết quả.

Điều làm tôi bối rối là những gì cổng cũng không được cho là dành cho.


Phương pháp của bạn thất bại cho các đầu vào 0FF, 1EF, 2DF, 3CF, 4BF, 5AF, 69F, 78F, 87F, 96F, A5F, B4F, C3F, D2F, E1F, F0F, FFF. Dòng thứ ba của bạn cần đọcc3,r3 = r2 + c2 + 1
Nick Gammon

0

Câu trả lời đầy đủ:

Như @Neil_UK đã nói, tôi có 12 bit và nếu tôi muốn kiểm tra xem số đó có chia hết cho 15 hay không, tôi sẽ lấy 12 bit và xem chúng là 3 số trong cơ sở 16.

Tôi cộng ba số lại với nhau, trong khi luôn thêm phần mang vào bộ cộng tiếp theo.

Sau khi thêm tất cả, tôi sẽ nhận được một số kết quả. Như tôi đã nói, chúng tôi muốn xem liệu số đó có chia hết cho 15 hay không và vì các số này nằm trong cơ sở 16, vì vậy nếu kết quả là 15 - thì số đó chia hết cho 15.

Nếu số đó là 15, ở dạng nhị phân 1111, vì vậy nếu tôi thêm 1vào 1111, tôi sẽ nhận được 10000.

Nếu số đó là 0, ở dạng nhị phân 0000, vì vậy nếu tôi thêm 1vào 0000, tôi sẽ nhận được 0001.

Đây là nơi mà NOR đến chơi.

Số này chia hết cho 15 nếu 3 chữ số cuối là 0.

Mạch:

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

Ví dụ:

1111 1111 1111:

  • 1111+ 1111+ 1= mang 11111
  • 1111 + 1111+ mang 1= mang 11111
  • 1111+ mang 1= mang 10000
  • BẮC (0,0,0) = Đúng

0001 1001 0101: (405):

  • 0101+ 1001+ 1=1111
  • 1111+ 0001= mang 10000
  • 0000+ mang 1=0001
  • BẮC (0,0,0) = Đúng
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.