Cách chia số nhị phân cho 2 python

Để chia các số nhị phân, hãy bắt đầu bằng cách thiết lập bài toán chia nhị phân ở định dạng chia dài. Tiếp theo, so sánh số chia với chữ số đầu tiên của số bị chia. Giải quyết các chữ số tiếp theo và lặp lại cho đến khi bạn nhận được 1, sau đó tìm phần còn lại. Đưa chữ số tiếp theo của số chia xuống và lặp lại quy trình cho đến khi bạn giải được bài toán. Để tìm hiểu cách chia số nhị phân bằng phương pháp bổ sung, hãy đọc tiếp

Bản tóm tắt này có giúp ích gì cho bạn không? Có Không

Cảm ơn tất cả các tác giả đã tạo ra một trang đã được đọc 725.664 lần

Cho một số nguyên dương n là số bị chia và một số khác m (dạng 2^k), tìm thương và số dư mà không thực hiện phép chia thực tế

ví dụ

Đầu vào. n = 43, m = 8
đầu ra. Thương = 5, Số dư = 3

Đầu vào. n = 58, m = 16
đầu ra. Thương = 3, Số dư = 10

Đề nghị thực hành

Vui lòng thử cách tiếp cận của bạn trên IDE trước, trước
chuyển sang giải pháp

Thử nó

Một cách tiếp cận sử dụng hoạt động bitwise

Trong phần này, chúng tôi đang sử dụng biểu diễn bitwise của một số để hiểu vai trò của phép chia bất kỳ số nào cho ước của dạng 2^k. Tất cả các số là lũy thừa của hai chỉ bao gồm 1 bit được đặt trong biểu diễn của chúng và chúng tôi sẽ sử dụng thuộc tính này.  

Để tìm phần còn lại, chúng tôi sẽ lấy logic AND của cổ tức (n) và số chia trừ 1 (m-1), điều này sẽ chỉ cung cấp các bit cổ tức đã đặt ngay cho bit đã đặt của số chia, đây là phần còn lại thực tế của chúng tôi trong trường hợp đó.  

Cho hai số nguyên, một là số bị chia và số còn lại là số chia, chúng ta cần tìm thương khi số bị chia chia cho số chia mà không sử dụng bất kỳ toán tử “ / “ và “ % “ nào.  

ví dụ

Đầu vào. cổ tức = 10, số chia = 2
đầu ra. 5
Giải trình. 10/2 = 5

Đầu vào. cổ tức = 10, số chia = 3
đầu ra. 3
Giải trình. 10/3 = 3. 33333… bị cắt ngắn thành 3

Đầu vào. cổ tức = 10, số chia = -2
đầu ra. -5
Giải trình. 10/-2 = -5

Đề nghị thực hành

Vui lòng thử cách tiếp cận của bạn trên IDE trước, trước khi chuyển sang giải pháp

Thử nó

Tiếp cận. Để giải quyết vấn đề bằng Tìm kiếm nhị phân, hãy làm theo ý tưởng bên dưới

Chúng ta đã biết rằng Thương * Số chia ≤ Cổ tức và Thương nằm giữa 0 và Cổ tức. Do đó, chúng ta có thể giả sử Thương là ở giữa, Cổ tức là cận trên và 0 là cận dưới và có thể dễ dàng sử dụng tìm kiếm nhị phân để đáp ứng các điều khoản của phép chia là Thương * Số chia ≤ Cổ tức

Thực hiện theo các bước để giải quyết vấn đề

  • Đầu tiên, đặt cao = cổ tức và thấp  = 0
  • Sau đó, chúng ta cần tìm giữa ( i. e Thương số ) = thấp + (cao – thấp) / 2
  • Sau đó, chúng tôi thực hiện Tìm kiếm nhị phân trong phạm vi từ 0 đến cổ tức
  • Nếu mid * số chia > cổ tức, thì cập nhật cao = mid – 1
  • Khác chúng tôi cập nhật thấp = trung bình + 1
  • Giá trị của mid thỏa mãn điều kiện (i. e mid * số chia ≤ cổ tức) là thương số của chúng tôi
  • Sau đó, chúng tôi trả lại bằng cách kiểm tra tính chẵn lẻ.  

Dưới đây là việc thực hiện các phương pháp trên

C++




// C++ code to find the Quotient

// using Binary Search Algorithm.

 

#include <bits/stdc++.h>

using namespace std;

 

// Function to find the quotient using binary search

int divide_binary_search(int // C++ code to find the Quotient1int // C++ code to find the Quotient3

// C++ code to find the Quotient4

// C++ code to find the Quotient5// C++ code to find the Quotient6 // C++ code to find the Quotient7

// C++ code to find the Quotient8// C++ code to find the Quotient9 // using Binary Search Algorithm.0

 

// C++ code to find the Quotient5// C++ code to find the Quotient6 // using Binary Search Algorithm.25_______3_______73 #include <bits/stdc++.h>83 #include <bits/stdc++.h>84// C++ code to find the Quotient73 #include <bits/stdc++.h>86 #include <bits/stdc++.h>87// C++ code to find the Quotient73 #include <bits/stdc++.h>83 #include <bits/stdc++.h>90// C++ code to find the Quotient73#include <bits/stdc++.h>92

Bây giờ bạn có thể cộng và trừ các số nhị phân (Khóa học Python #5. Cộng và trừ các số nhị phân), hãy tiến thêm một bước nữa và nhân và chia các số nhị phân

Nhân các số nhị phân

Trước tiên, hãy xem phép nhân thập phân và cách bạn có thể đã học cách thực hiện ở trường. Lấy ví dụ, phép nhân của \(23\cdot 45\). Ở bước đầu tiên, bạn nhân \(3\) với \(4\) (chữ số cuối cùng của số/hệ số đầu tiên và chữ số đầu tiên của số thứ hai), được 12. Số 2 được viết trực tiếp dưới chữ số đầu tiên của số thứ hai trong khi số 1, đại diện cho 10 trong 12, được chuyển sang vị trí tiếp theo

\[\begin{eqnarray} 2\underline{3} \cdot \underline{4}5\\\hline \quad_1 2\hspace{0. 5em} \end{eqnarray}\]

Trong bước tiếp theo, chữ số tiếp theo của số thứ nhất được nhân với chữ số đầu tiên của số thứ hai (\(2\cdot 4\)). Kết quả của phép tính này đại diện cho vị trí thập phân tiếp theo. Do đó, nó được viết ra trước kết quả của phép nhân đầu tiên và nếu một chữ số được chuyển từ kết quả trước đó, chúng sẽ được cộng lại với nhau

\[\begin{eqnarray} \underline{2}3 \cdot \underline{4}5\\\hline 92\hspace{0. 5em} \end{eqnarray}\]

Bước này được lặp lại cho đến khi tất cả các chữ số của số thứ nhất được nhân với chữ số đầu tiên của số thứ hai. Sau đó, chữ số thứ hai của số thứ hai được sử dụng và nhân với mọi chữ số của số thứ nhất đi từ phải sang trái. Vì vậy, trong ví dụ này, cặp chữ số đầu tiên phải được nhân là. \(3\cchấm 5\). Phép nhân này bây giờ được viết dưới số xuất phát từ phép nhân chữ số đầu tiên của số thứ hai với tất cả các chữ số của số thứ nhất. Tuy nhiên, nó được dịch chuyển trở lại một chữ số

\[\begin{eqnarray} 2\underline{3} \cdot 4\underline{5}\\\hline 92\hspace{0. 5em}\\ \quad_1 5 \end{eqnarray}\]

Và như bạn có thể đoán bây giờ, cặp chữ số tiếp theo cần nhân là \(2\cdot 5\)

\[\begin{eqnarray} 2\underline{3} \cdot 4\underline{5}\\\hline 92\hspace{0. 5em}\\ 115 \end{eqnarray}\]

Và nếu bạn có nhiều chữ số hơn trong số thứ hai, bước này được lặp lại cho đến khi mỗi chữ số của số thứ nhất được nhân với mỗi chữ số của số thứ hai

Bước cuối cùng là cộng tất cả các kết quả lại với nhau sẽ cho bạn kết quả của toàn bộ phép nhân

\[\begin{eqnarray} 23 \cdot 45\\\hline 92\hspace{0. 5em}\\ +\hspace{0. 5em}115\\\hline 1035 \end{eqnarray}\]

Phép nhân nhị phân hoạt động theo cùng một cách chính xác. Nhưng thay vì số thập phân, số nhị phân được sử dụng. Và vì chỉ tính đến các phép nhân bao gồm các số \(1\) và \(0\) nên việc này trở nên dễ dàng hơn nhiều. Bởi vì mọi phép nhân bao gồm \(0\) đều dẫn đến \(0\) và chỉ \(1\cdot 1\) là \(1\). Và điều này có nghĩa là không có bit mang khi nhân bit với nhau, đó là lý do tại sao việc nhân các số nhị phân dễ dàng hơn nhiều

Ví dụ: nhân \(10_{10} = 1010_2\) với \(5_{10} = 10_2\). Trong bước đầu tiên, bit cuối cùng của số thứ nhất được nhân với bit đầu tiên của số thứ hai

\[\begin{eqnarray} 101\underline{0} \cdot \underline{1}01\\\hline 0\hspace{0. 5em}\hspace{0. 5em} \end{eqnarray}\]

Vì không có bit mang khi chỉ nhân các số đơn và số không, bạn có thể mang một bit nhân các bit khác của số đầu tiên với chữ số đầu tiên của số thứ hai

\[\begin{eqnarray} \underline{1010} \cdot \underline{1}01\\\hline 1010\hspace{0. 5em}\hspace{0. 5em} \end{eqnarray}\]

Bây giờ hãy nhìn vào hàng đầu tiên. Nó bằng số với số đầu tiên của phép nhân. Bây giờ bạn có thể chuyển sang chữ số tiếp theo của số thứ hai và nhân nó với tất cả các chữ số của số thứ nhất

\[\begin{eqnarray} \underline{1010} \cdot 1\underline{0}1\\\hline 1010\hspace{0. 5em}\hspace{0. 5em}\\ 0000\hspace{0. 5em} \end{eqnarray}\]

Bạn có thể thấy rằng toàn bộ hàng là \(0\) vì \(0\) nhân với bất kỳ thứ gì luôn là \(0\). Đây là lý do thứ hai tại sao việc nhân các số nhị phân lại dễ dàng như vậy so với các số thập phân. Bây giờ bạn có thể thực hiện phép nhân với bit cuối cùng của số thứ hai. Đó chỉ là viết ra số đầu tiên bắt đầu từ dưới bit cuối cùng

\[\begin{eqnarray} \underline{1010} \cdot 1\underline{0}1\\\hline 1010\hspace{0. 5em}\hspace{0. 5em}\\ 0000\hspace{0. 5em}\\ 1010 \end{eqnarray}\]

Để dễ dàng hơn nữa, bạn có thể bỏ qua hoàn toàn \(0\) bit 0 của số thứ hai và dịch chuyển phần đầu của hàng tiếp theo sang bên phải thêm một bit. Mà sẽ dẫn đến

\[\begin{eqnarray} \underline{1010} \cdot 1\underline{0}1\\\hline 1010\hspace{0. 5em}\hspace{0. 5em}\\ 1010 \end{eqnarray}\]

Bước cuối cùng, như trong phép nhân thập phân, cộng tất cả các hàng. Và nếu bạn quên cách thêm số nhị phân, hãy xem nhanh Khóa học Python #5. Cộng và trừ các số nhị phân

\[\begin{eqnarray} \underline{1010} \cdot 1\underline{0}1\\\hline 1010\hspace{0. 5em}\hspace{0. 5em}\\ \oplus\quad\quad1010\\\hline 110010 \end{eqnarray}\]

Khi bạn có nhiều hơn hai hàng để cộng lại với nhau, đôi khi bạn nên chia phần bổ sung thành các phần nhỏ hơn và cộng chúng lại với nhau lần lượt

Khi nhân một số nhị phân với lũy thừa \(2\), chẳng hạn như \(2\), \(4\), \(8\), \(16\), v.v. , bạn có thể tăng tốc độ tính toán của mình hơn nữa. Bởi vì với mỗi phép nhân với \(2^x \geq 2\) bạn có thể thêm số 0 vào cuối số được nhân với lũy thừa \(2\). Thao tác này được gọi là dịch trái vì mọi bit đều được dịch sang vế trái. Lấy ví dụ,

\[42_{10} = 101010_2\]

và bạn muốn nhân nó với \(4\). Khi bạn nối thêm một \(0\) bạn nhận được

\[1010100_2 = 84_{10}\]

và khi bạn thêm một \(0\) khác, bạn sẽ nhận được

\[10101000_2 = 168_{10}\]

Thủ thuật này được sử dụng khá thường xuyên trong khoa học máy tính và kỹ thuật vì bản thân phép nhân có thể rất tốn thời gian. Rốt cuộc, nó bao gồm nhiều phép nhân bit đơn nhỏ và một số phép cộng. Thao tác dịch chuyển trái cũng có sẵn trong Python dưới dạng <<. Bạn có thể dùng thử mã này để kiểm tra

________0________1

Chia số nhị phân

Bây giờ bạn đã biết cách nhân các số nhị phân, hãy xem phép toán phức tạp nhất, phép chia. Rõ ràng, bạn chỉ có số nguyên ở dạng nhị phân; . Vì phép nhân nhị phân sử dụng phép cộng và phép nhân một bit, phép chia hoạt động của bộ đếm sử dụng phép chia và phép trừ chính để chia hai số nhị phân

Trong ví dụ này \(132_{10} = 10000100_2\) sẽ chia cho \(13_{10} = 1101_2\). Ở bước đầu tiên, bạn cần phần bù âm của hai số \(13_{10} = 1101_2\) là \(10011_2\) (được mở rộng thêm một bit sao cho MSB được đặt thành \(1\)). Để bắt đầu quá trình chia, hãy viết cả hai số và mở rộng số bị chia với \(0\) ở phía trước để đánh dấu nó là số dương, chừa một khoảng trống bên dưới các số và thêm dấu bằng ở cuối

\[010000100 \div 1101 =\]

Lấy \(n\) bit đầu tiên (độ dài của số chia) bắt đầu từ \(1\) đầu tiên của số bị chia và so sánh nó với số chia thì chỉ có ba khả năng số chia nhỏ hơn, bằng hoặc lớn hơn . Trong ví dụ này, các bit để kiểm tra cổ tức là \(1000\); . Vì số chia không "vừa" với các bit đó (người ta cũng có thể nói rằng số chia được chứa \(0\) lần trong các bit đó), bạn cần một số có nghĩa hơn để "vừa" với số chia. Để theo dõi rằng số chia được chứa \(0\) lần trong các bit đã chọn, hãy viết \(0\) sau dấu bằng và lưu ý bốn \(0000\) dưới các bit mà số chia không “vừa” với

\[\begin{eqnarray} 0\underline{1000}0100 \div 1101 = 0\\ 0000\quad\quad\quad\quad\quad\quad\quad\hspace{0. 2em} \end{eqnarray}\]

Bây giờ bạn có thể trừ \(0000\) từ \(1000\) chỉ là \(1000\) và viết nó dưới \(0000\) sao cho các bit thẳng hàng

\[\begin{eqnarray} 010000100 \div 1101 = 0\\ \underline{0000}\quad\quad\quad\quad\quad\quad\quad\\ 1000\quad\quad\quad\quad\quad\quad\ . 1em}\\ \end{eqnarray}\]

Giờ đây, bạn có thể mở rộng con số này thành “fit” \(1101\) bằng cách nhận bit tiếp theo từ cổ tức

\[\begin{eqnarray} 01000\underline{0}100 \div 1101 = 0\\ \underline{0000}\quad\quad\quad\quad\quad\quad\quad\hspace{0. 1em}\\ 10000\hspace{0. 6em}\quad\quad\quad\quad\quad\quad\hspace{0. 1em}\\ \end{eqnarray}\]

Bây giờ \(1101\) khớp với \(10000\). Và một thuộc tính thú vị của việc sử dụng kỹ thuật này là số chia khớp với \(0\) hoặc \(1\) lần vào các bit đến từ số bị chia. Và lần này, số chia có thể được trừ khỏi chuỗi bit được “kéo xuống” từ số bị chia. Phần bù hai của số chia được dùng để thực hiện phép trừ. Thực tế là số chia phù hợp với chúng được theo dõi bằng cách viết \(1\) ở cuối số đến sau dấu bằng

\[\begin{eqnarray} 010000100 \div 1101 = 01\\ \underline{0000}\quad\quad\quad\quad\quad\quad\quad\hspace{0. 4em}\\ 10000\hspace{0. 6em}\quad\quad\quad\quad\quad\quad\hspace{0. 4em}\\ \underline{\oplus\hspace{0. 3em}10011}\hspace{0. 5em}\quad\quad\quad\quad\quad\quad\hspace{0. 4em}\\ \cancel{1}00011\hspace{0. 6em}\quad\quad\quad\quad\quad\quad\hspace{0. 4em}\\ \end{eqnarray}\]

Sau phép trừ, bit tiếp theo từ số chia có thể được kéo xuống. Sau đó, bạn phải kiểm tra xem \(1101\) có khớp với \(111\) không. Vì vậy, hãy tiếp tục và trừ \(0000\) khỏi nó và theo dõi sự thật rằng \(1101\) được chứa trong \(111\) \(0\) lần bằng cách viết \(0\) khác vào cuối các số

\[\begin{eqnarray} 010000\underline{1}00 \div 1101 = 010\\ \underline{0000}\quad\quad\quad\quad\quad\quad\quad\hspace{1em}\\ 10000\hspace . 6em}\quad\quad\quad\quad\quad\quad\hspace{1em}\\ \underline{\oplus\hspace{0. 3em}10011}\hspace{0. 5em}\quad\quad\quad\quad\quad\quad\hspace{1em}\\ 000111\hspace{0. 1em}\quad\quad\quad\quad\quad\quad\hspace{1em}\\ \underline{0000}\hspace{0. 1em}\quad\quad\quad\quad\quad\quad\hspace{1em}\\ 0111\hspace{0. 1em}\quad\quad\quad\quad\quad\quad\hspace{1em} \end{eqnarray}\]

Bây giờ bạn có thể lấy bit tiếp theo từ số chia. Lần này, bạn phải kiểm tra xem \(1101\) có nằm trong \(1110\) hay không và đó thực sự là trường hợp để bạn có thể trừ \(1101\) khỏi \(1110\) bằng cách thêm phần bù hai của nó và thêm một

\[\begin{eqnarray} 0100001\underline{0}0 \div 1101 = 0101\\ \underline{0000}\quad\quad\quad\quad\quad\quad\quad\hspace{1. 4em}\\ 10000\hspace{0. 6em}\quad\quad\quad\quad\quad\quad\hspace{1. 4em}\\ \underline{\oplus\hspace{0. 3em}10011}\hspace{0. 5em}\quad\quad\quad\quad\quad\quad\hspace{1. 4em}\\ 000111\hspace{0. 1em}\quad\quad\quad\quad\quad\quad\hspace{1. 4em}\\ \gạch chân{0000}\hspace{0. 1em}\quad\quad\quad\quad\quad\quad\hspace{1. 4em}\\ 01110\hspace{0. 7em}\quad\quad\quad\quad\quad\hspace{1. 4em}\\ \underline{\oplus\hspace{0. 3em}10011}\hspace{0. 6em}\quad\quad\quad\quad\quad\hspace{1. 4em}\\ 00001\hspace{0. 7em}\quad\quad\quad\quad\quad\hspace{1. 4em} \end{eqnarray}\]

Sau bước này, chỉ còn một bit từ số chia. Việc thêm bit này dẫn đến \(10\) trong đó \(1101\) không khớp, điều này một lần nữa có nghĩa là trừ $0000$ và thêm $0$ vào kết quả. Sau phép trừ, bạn còn lại \(10\), là phần còn lại của phép chia

\[\begin{eqnarray} 01000010\underline{0} \div 1101 = 01010\hspace{0. 4em}R. 10\\ \underline{0000}\quad\quad\quad\quad\quad\quad\quad \quad\quad\quad\quad\hspace{1em}\\ 10000\hspace{0. 6em}\quad\quad\quad\quad\quad\quad \quad\quad\quad\quad\hspace{1em}\\ \underline{\oplus\hspace{0. 3em}10011}\hspace{0. 5em}\quad\quad\quad\quad\quad\quad \quad\quad\quad\quad\hspace{1em}\\ 000111\hspace{0. 1em}\quad\quad\quad\quad\quad\quad \quad\quad\quad\quad\hspace{1em}\\ \underline{0000}\hspace{0. 1em}\quad\quad\quad\quad\quad\quad \quad\quad\quad\quad\hspace{1em}\\ 01110\hspace{0. 7em}\quad\quad\quad\quad\quad \quad\quad\quad\quad\hspace{1em}\\ \underline{\oplus\hspace{0. 3em}10011}\hspace{0. 6em}\quad\quad\quad\quad\quad \quad\quad\quad\quad\hspace{1em}\\ 000010\hspace{0. 2em}\quad\quad\quad\quad\quad \quad\quad\quad\quad\hspace{1em}\\ \underline{0000}\hspace{0. 2em}\quad\quad\quad\quad\quad \quad\quad\quad\quad\hspace{0. 9em}\\ 10\hspace{0. 2em}\quad\quad\quad\quad\quad\quad\quad\quad\quad\hspace{0. 9em} \end{eqnarray}\]

Kiểm tra kết quả ở dạng thập phân cho thấy \(132\div 13 = 10\hspace{0. 4em}R. 2\) với \(10_{10} = 1010_2\) và \(2_{10} = 10_2\). Tóm lại, đây là các bước của phân chia nhị phân

  1. Kiểm tra xem số chia có khớp với phần ngoài cùng bên trái của số bị chia chưa được sử dụng không
    • nếu số chia không vừa với nó, hãy trừ 0 và thêm \(0\) vào kết quả
    • nếu số chia vừa với nó, hãy trừ (thêm phần bù của hai số) và thêm \(1\) vào kết quả
  2. Kiểm tra xem có còn bit nào trong cổ tức không
    • nếu có bit, hãy kéo bit tiếp theo xuống và thực hiện bước 1
    • nếu không có bit nào, kết quả phép trừ cuối cùng là phần còn lại và số sau dấu bằng là kết quả

Bạn cũng có thể nhận được kết quả với phần dư trong Python bằng cách sử dụng toán tử chia số nguyên // và toán tử modulo %

x = 42
print(f"{x} = {x:b}")
y = x << 2
print(f"{y} = {y:b}")
0

Và như một hoạt động cuối cùng, có dịch chuyển trái

x = 42
print(f"{x} = {x:b}")
y = x << 2
print(f"{y} = {y:b}")
1 là hoạt động nghịch đảo của dịch chuyển phải << và sẽ chia cho 2 cho mỗi bit mà số được dịch chuyển

x = 42
print(f"{x} = {x:b}")
y = x << 2
print(f"{y} = {y:b}")
3

Và điều này kết thúc bài viết này về cách nhân và chia số nhị phân. Tôi khuyến khích bạn thử tự mình thực hiện phép nhân và phép chia nhị phân vì tự mình làm mọi việc là một trong những cách học tốt nhất

Nếu bạn có bất kỳ câu hỏi nào về bài viết này, vui lòng tham gia cộng đồng Discord của chúng tôi để hỏi họ ở đó

Phép toán nào nhân một số nhị phân với 2?

Một số có thể được nhân với 2 bằng cách sử dụng toán tử bit . Điều này được thực hiện bằng cách sử dụng toán tử dịch chuyển trái và dịch chuyển các bit sang trái 1. Điều này dẫn đến gấp đôi số trước đó.

Chúng ta có thể chia số nhị phân không?

Quá trình chia nhị phân tương tự như chia dài trong hệ thập phân. Cổ tức vẫn được chia cho số chia theo cách tương tự, với sự khác biệt đáng kể duy nhất là việc sử dụng phép trừ nhị phân thay vì phép trừ thập phân