สลับตัวเลขสองตัวโดยไม่ใช้ตัวแปรที่สาม: C, Python โครงการ
ในการเขียนโปรแกรม การสลับภาษาหมายถึงการสลับค่าของตัวแปรสองตัว ตัวแปรอาจมีตัวเลข สตริง รายการหรืออาร์เรย์ วัตถุ ฯลฯ วิธีการสลับโดยทั่วไปคือการใช้ตัวแปรชั่วคราวเพื่อเก็บค่า ตัวอย่างเช่น,
ขั้นตอนทั่วไปในการสลับตัวเลขสองตัวมีดังนี้:
- ประกาศตัวแปรชั่วคราว C
- กำหนดค่าของ A ถึง C ซึ่งหมายถึง C = A ตอนนี้ C = 20
- กำหนดค่าของ B ถึง A ดังนั้น A = 30
- กำหนดค่าของ C ถึง B ดังนั้น B = 20 เนื่องจาก C มีค่า 20
วิธีการสลับทำได้ด้วยความช่วยเหลือของตัวแปรชั่วคราว วิธีนี้จะใช้ได้กับทั้งตัวเลขจำนวนเต็มและตัวเลขทศนิยมด้วยเช่นกัน
สลับโดยใช้สมการเลขคณิต
อย่างที่ทราบกันดีว่า การสลับหมายถึงการสลับเนื้อหาของอ็อบเจ็กต์หรือฟิลด์หรือตัวแปรสองตัว การสลับโดยใช้การคำนวณทางคณิตศาสตร์หมายถึงการดำเนินการสลับโดยใช้สมการทางคณิตศาสตร์ เช่น การบวกและการลบ
ถ้าเราได้รับตัวเลขสองตัวและขอให้สลับโดยไม่ใช้ตัวแปรชั่วคราว จากนั้นโดยใช้สมการเลขคณิตสามสมการ เราก็สามารถสลับตัวเลขได้
รหัสเทียมสำหรับการสลับตัวเลขโดยใช้การดำเนินการทางคณิตศาสตร์:
A = A + B B = A - B A = A - B
สมมติว่าเรามีตัวเลขสองตัวคือ A = 20 และ B = 30
เงื่อนไขที่ 1: ก = ก+ข
ดังนั้น ค่าปัจจุบันของ A คือ 20+30 = 50
เงื่อนไขที่ 2: บี = เอบี
ตอนนี้ B = 50-30 = 20
เราเห็นได้ว่าเราได้ค่า A ใน B
เงื่อนไขที่ 3: ก = เอบี
สุดท้าย A = 50-20 = 30
A มีค่าเริ่มต้นเป็น B
แล้วเราก็สลับตัวเลขกัน
นี่คือโปรแกรมสำหรับสลับตัวเลขสองตัวใน C/C++:
#include<stdio.h> int main() { int a, b; printf("Enter value of A: "); scanf("%d", & a); printf("Enter value of B: "); scanf("%d", & b); printf("A = %d, B = %d", a, b); a = a + b; b = a - b; a = a - b; printf("\nNow, A = %d, B = %d", a, b); }
Output:
Enter value of A: 20 Enter value of B: 30 A = 20 , B = 30 Now, A = 30 , B = 20
โปรแกรมใน Python:
a = int(input("Enter value of A: ")) b = int(input("Enter value of B: ")) print("A = {} and B = {}".format(a, b)) a = a + b b = a - b a = a - b print("Now, A = {} and B = {}".format(a, b))
Output:
Enter value of A: 20 Enter value of B: 30 A = 20 , B = 30 Now, A = 30 , B = 20
ตอนนี้ใน Pythonเราไม่จำเป็นต้องทำการคำนวณทางคณิตศาสตร์ด้วยซ้ำ เราสามารถใช้:
ก,ข = ข,ก
นี่คือการสาธิตโดยที่ a=20, b=30;
สลับโดยใช้ Bitwise XOR OperaTor
วิธีนี้เรียกอีกอย่างว่า XOR swap XOR หมายถึง OR แบบเฉพาะ เราใช้บิตสองบิตเป็นอินพุตของ XOR ในการดำเนินการแบบบิตต่อบิตนี้ หากต้องการรับเอาต์พุตหนึ่งรายการจาก XOR อินพุตหนึ่งรายการจะต้องเป็น 1 เท่านั้น มิฉะนั้น เอาต์พุตจะเป็น 0 ตารางต่อไปนี้แสดงเอาต์พุตสำหรับชุดค่าผสมของอินพุต A B ทั้งหมด
เราจำเป็นต้องทราบว่าการดำเนินการ XOR ทำงานอย่างไรในการสลับตัวเลขสองตัวโดยใช้การดำเนินการตามบิต นี่คือตารางสำหรับ XOR โดยที่ A และ B คือค่าอินพุต
A | B | เอ เอ็กซ์ออร์ บี |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
หากอินพุตสองตัวมีค่าเท่ากัน การดำเนินการ XOR จะให้ค่าเป็น 0 มิฉะนั้นจะให้ค่าเป็น 1 สำหรับตัวอย่างนี้ เราจะใช้การดำเนินการ XOR 3 ในภาษาการเขียนโปรแกรมส่วนใหญ่ XOR จะแสดงเป็น "^"
สมมติว่า A=4 (ใน Binary = 0100) และ B=7(ใน Binary, 0111)
เงื่อนไขที่ 1: ก = ก ^ บี
A | 0 | 1 | 0 | 0 |
B | 0 | 1 | 1 | 1 |
เอ ^ บี | 0 | 0 | 1 | 1 |
ตอนนี้ A = 0011 (ในรูปแบบไบนารี)
เงื่อนไขที่ 2: บี = เอ^บี
A | 0 | 0 | 1 | 1 |
B | 0 | 1 | 1 | 1 |
เอ ^ บี | 0 | 1 | 0 | 0 |
ดังนั้น B = 0100 ซึ่งเป็นค่าไบนารีเริ่มต้นของ A
เงื่อนไขที่ 3: ก = ก^ข
A | 0 | 0 | 1 | 1 |
B | 0 | 1 | 0 | 0 |
เอ ^ บี | 0 | 1 | 1 | 1 |
สุดท้าย A = 0111 ซึ่งเป็นค่าไบนารี่ที่เทียบเท่ากับ B
โปรแกรมในภาษา C/C++:
#include<stdio.h> int main() { int a, b; printf("Enter value of A: "); scanf("%d", & a); printf("Enter value of B: "); scanf("%d", & b); printf("A = %d, B = %d", a, b); a = a ^ b; b = a ^ b; a = a ^ b; printf("\nNow, A = %d, B = %d", a, b); }
Output:
Enter value of A:4 Enter value of B:7 A=4, B=7 Now, A=7, B=4.
โปรแกรมใน Python:
a = int(input("Enter value of A: ")) b = int(input("Enter value of B: ")) print("A = {} and B = {}".format(a, b)) a = a ^ b b = a ^ b a = a ^ b print("Now, A = {} and B = {}".format(a, b))
Output:
Enter the value of A:10 Enter the value of B:15 A=10 and B=15 Now, A=15,B=10.
แลกเปลี่ยน Numbers โดยใช้ Bitwise-Arithmetic
วิธีการนี้เหมือนกับวิธีการทางคณิตศาสตร์ แต่เราจะใช้การดำเนินการตามบิต เช่น AND, OR และ Compliment เพื่อดำเนินการบวกและลบ ก่อนที่จะไปยังขั้นตอนต่างๆ มาดู "Compliment" กันก่อน
ส่วนเสริมของ 1 หมายถึงการเปลี่ยน 0 เป็น 1 และ 1 เป็น 0 ทั้งหมด มาดูตัวอย่างกัน
- สมมติว่าตัวเลข 23 เป็นเลขทศนิยม
- การแปลงเป็น Binary ให้ใช้ 10111 มีเพียง 5 บิต แต่คอมพิวเตอร์เก็บตัวเลขไว้ 8,16,32,64 .. บิต ลองบวกศูนย์หน้าไบนารี่กัน จะไม่เปลี่ยนค่าเดิมของตัวเลข มันจึงจะกลายเป็น 00010111.
- ดังที่เราทราบ คำชมเชยของ 1 หมายถึงการเปลี่ยน 0 เป็น 1 และ 1 เป็น 0 ทั้งหมด ดังนั้นการใช้ส่วนเสริมของ 1 แทน 00010111 จะช่วยให้ 11101000
ส่วนเสริมของ 1 นี้แสดงด้วย “~” สัญลักษณ์นี้ในภาษาโปรแกรมส่วนใหญ่ การใส่สัญลักษณ์นี้หน้าค่าจำนวนเต็มหรือค่าจุดลอยตัวใดๆ จะทำให้เป็นส่วนเสริมของ 1
ส่วนเสริมของ 2 หมายถึงการบวกเลขฐานสอง “1” เข้าไปในส่วนเสริมของ 1 หากเราทำส่วนเสริมของ 2 กับตัวเลขด้านบน:
- ไบนารี = 00010111
- คำชมเชย 1 = 11101000
- คำชมเชยที่ 2:
11101000
+1
11101001
ส่วนเสริมของ 2 คือ 11101001 นี่คือไบนารี่ของ -23
โดยสรุป สำหรับการแสดงส่วนเสริม 2 ของตัวเลข A จะมีลักษณะดังนี้:
ส่วนเสริมของ 2 ของ A = (~A) + 1
ตอนนี้สมมติว่า A=8 (ไบนารี 00001000), B=10(00001010)
เงื่อนไขที่ 1: ก = (ก & ข) + (ก | ข)
มันเทียบเท่ากับ A = A + B
เอ และ บี = 00001000 & 00001010 = 00001000
ก | บี = 00001000 | 00001010 = 00001010
ตอนนี้ 00001000 + 00001010 = 00010010 (ทศนิยม 18)
ดังนั้น A = 18
เงื่อนไขที่ 2: ข = ก + (~ข) + 1
เทียบเท่ากับ B = AB
ในที่นี้ B = A – B
จากการสนทนาข้างต้น หากเราจำเป็นต้องลบ เราจะทำการบวก 2 เข้ากับจำนวนลบแล้วจึงบวกเข้าไป
ดังนั้น -B = ~B + 1
ตอนนี้ B = 00010010 + (11110101) + 1 = 00001000
ค่าของ B เทียบเท่ากับทศนิยม 8 ซึ่งเป็นค่าเริ่มต้น
เงื่อนไขที่ 3: ก = ก + (~B) + 1
เทียบเท่ากับ A = AB
ตอนนี้ A = 00010010 + 11110111 + 1
A = 00001010 (เทียบเท่ากับทศนิยม 10)
ในที่สุด A ก็ได้ค่า B ดังนั้นการสลับจึงเสร็จสิ้น
โปรแกรมในภาษา C/C++:
#include<stdio.h> int main() { int a, b; printf("Enter value of A: "); scanf("%d", & a); printf("Enter value of B: "); scanf("%d", & b); printf("A = %d, B = %d", a, b); a = (a & b) + (a | b); b = a + ~b + 1; a = a + ~b + 1; printf("\nNow, A = %d, B = %d", a, b); }
Output:
Enter the value of A: 8 Enter the value of B:10 A=8, B=10 Now, A=10, B=8
โปรแกรมใน Python:
a = int(input("Enter value of A: ")) b = int(input("Enter value of B: ")) print("A = {} and B = {}".format(a, b)) a = (a & b) + (a | b) b = a + ~b + 1 a = a + ~b + 1 print("Now, A = {} and B = {}".format(a, b))
Output:
Enter the value of A: 25 Enter the value of B: 25 A = 25 and B = 25 Now, A = 25 and B = 25
เลขคณิตล้นคืออะไร?
คำว่าโอเวอร์โฟลว์หมายถึงการเกินขีดจำกัด โอเวอร์โฟลว์ทางคณิตศาสตร์หมายถึงผลลัพธ์ของการดำเนินการทางคณิตศาสตร์ใดๆ ก็ตามเกินขอบเขตหรือขีดจำกัดของการแสดงตัวเลขของสถาปัตยกรรมคอมพิวเตอร์ ตัวอย่างเช่น หากตัวเลขถูกหารด้วยศูนย์ ตัวเลขนั้นจะกลายเป็นอนันต์ และระบบตัวเลขของคอมพิวเตอร์ไม่สามารถเก็บตัวเลขนั้นไว้ในขนาด 32 หรือ 64 บิตได้
ผลที่ตามมาของการโอเวอร์โฟลว์ทางคณิตศาสตร์อาจเป็น:
- การบวกจำนวนบวกสองจำนวนจะกลายเป็นจำนวนลบ เนื่องจากบิตเครื่องหมายอาจกลายเป็น 1 ซึ่งหมายถึงจำนวนลบ
- การบวกจำนวนลบสองจำนวนจะกลายเป็นจำนวนบวก เนื่องจากบิตเครื่องหมายอาจกลายเป็น 0 ซึ่งหมายถึงจำนวนบวก