"ไม่มีอะไรดีไปกว่าการเขียนโค้ดที่มีประสิทธิภาพ Amigo! วางใจหุ่นยนต์ตัวเก่า"

“คุณกำลังพูดถึงรหัสลับที่สายลับใช้หรือเปล่า”

"ไม่แน่นอน ฉันกำลังพูดถึงการนำเสนอข้อมูลในรูปแบบที่ย่อยง่าย เกี่ยวกับระบบตัวเลข คุณทราบดีว่าในชีวิตประจำวันคนส่วนใหญ่ใช้ระบบเลขฐานสิบ โดยใช้สัญลักษณ์ 10 ตัวแทนตัวเลขทุกตัว: 0, 1, 2 , 3, 4, 5, 6, 7, 8, 9 ตัวเลขมี 10 ตัว จึงเรียกว่าระบบเลขฐานสิบ"

"นั่นสะดวกสำหรับมนุษย์ด้วยนิ้วทั้งสิบ แต่โปรแกรมเมอร์เป็นนักประดิษฐ์ครั้งใหญ่ พวกเขาคิดการเข้ารหัสที่ใช้ตัวเลขที่แตกต่างกันในทันที ตัวอย่างเช่น 2, 8, 16 หรือ 64 หลัก พวกเขาทำสิ่งนี้เพื่อ ทำให้สะดวกสำหรับคอมพิวเตอร์ซึ่งอาศัย 'มีสัญญาณ/ไม่มีสัญญาณ'"

"อา ฉันเห็นว่าพวกเขามีอะไรเหมือนกัน... ระบบทั้งหมดนี้ขึ้นอยู่กับพลังของทั้งสอง

การเข้ารหัสแปด

"ข้อสังเกตที่ดี เริ่มจากการเข้ารหัสที่เกี่ยวข้องกับตัวเลข 8 หลัก มนุษย์อาจพบว่าสิ่งนี้ง่ายที่สุด: เพียงแค่ทิ้งเลข 8 และ 9 และ — บูม — คุณมีการเข้ารหัสฐานแปด (ระบบตัวเลข) เมื่อเร็ว ๆ นี้มีคนบอกคุณเกี่ยวกับตัวอักษรใช่ไหม ?”

"ใช่ฉันเป็น."

"เซอร์ไพร์ส! คุณสามารถตั้งค่าตัวอักษรตัวเลขที่เข้ารหัสโดยใช้ระบบเลขฐานแปดได้ ถ้าคุณจำเป็นต้องทำจริงๆ มันง่ายกว่าที่คิด แค่ใส่0 หน้าจำนวนเต็ม

" ถ้าตัวอักษรที่เป็นตัวเลขขึ้นต้นด้วยศูนย์ หมายความว่ามันเป็นเลขฐานแปดใช่หรือไม่"

"ใช่ Java จะถือว่าเป็นฐานแปด

ตัวอย่าง:

รหัส หมายเหตุ
int x = 015;
x คือ 13:1*8+5
int x = 025;
x คือ 21: 2*8+5
int x = 0123;
x คือ 83: 1*64+2*8+3 == 1*8 2 +2*8 1 +3*8 0
int x = 078;
สิ่งนี้จะไม่คอมไพล์: 8 ไม่ใช่หนึ่งในสัญลักษณ์ที่ใช้ในการเข้ารหัสฐานแปด

"คุณไม่จำเป็นต้องเขียนเลขฐานแปดในโค้ดของคุณ แต่คุณควรรู้ว่ามันคืออะไร" ท้ายที่สุด คุณจะต้องอ่านโค้ดที่เขียนโดยผู้อื่น และตามที่กล่าวไว้ข้างต้น โปรแกรมเมอร์เป็นนักประดิษฐ์ที่ยิ่งใหญ่

จำไว้ว่าคุณไม่สามารถไปเขียน 0 หน้าตัวเลขทุกตัวได้"

"แต่ถ้าฉันตั้งใจให้มันเป็นเลขฐานแปด ฉันทำได้"

"ใช่.

การเข้ารหัสไบนารี

"แม้ว่าคุณจะยังไม่เข้าใจ แต่การเข้ารหัสแบบไบนารี่ก็เป็นภาษาแม่ของคุณ ผมขอเตือนคุณไว้ก่อน ถ้าเลขฐานแปดมีเฉพาะตัวเลข 0-7 แสดงว่าไบนารีมีแค่ 0 และ 1"

"ทำไมการเข้ารหัสนี้จึงจำเป็น"

"ดังที่ฉันได้กล่าวไว้ข้างต้น สิ่งนี้เกี่ยวข้องกับโครงสร้างภายในของคอมพิวเตอร์ ทุกอย่างในคอมพิวเตอร์ทำงานด้วยไฟฟ้า และเมื่อมันเกิดขึ้น วิธีที่มีประสิทธิภาพที่สุดในการจัดเก็บและส่งข้อมูลบางอย่างโดยใช้ไฟฟ้าคือการใช้สองสถานะ: ไม่มีไฟฟ้าในสาย (ศูนย์) และมีไฟฟ้า (หนึ่ง)"

"นั่นเป็นเหตุผลที่มันเป็นที่นิยมมาก... อืม ดูเหมือนว่าฉันจะเริ่มจำภาษานี้ได้จริงๆ!"

"โรบ็อตทุกตัวเข้าใจมันอย่างสมบูรณ์ แม้ว่ามันจะไม่ได้ใช้บ่อยนักใน Java Java ถือเป็นภาษาระดับสูง ซึ่งแยกออกจากฮาร์ดแวร์ที่มันทำงานโดยสิ้นเชิง คุณสนใจจริงๆ ไหมว่ารูปแบบใดที่ใช้ในการจัดเก็บและประมวลผลข้อมูล ภายในเครื่องคอมพิวเตอร์?

"แต่ในช่วงหลายทศวรรษที่ผ่านมา โปรแกรมเมอร์ต่างชื่นชอบการเข้ารหัสไบนารี (และการเข้ารหัสอื่นๆ ที่อิงตามนั้น) ด้วยเหตุนี้ Java จึงมีตัวดำเนินการที่ใช้เลขฐานสองเป็นอินพุต และความแม่นยำของเลขทศนิยมขึ้นอยู่กับเลขฐานสอง การเป็นตัวแทน

"ในระยะสั้น คุณควรรู้เกี่ยวกับการเข้ารหัสนี้ดีกว่าไม่รู้"

"ถูกต้อง และเช่นเดียวกับกรณีการเข้ารหัสฐานแปด Java มีวิธีการเข้ารหัสตัวอักษรโดยใช้ระบบเลขฐานสอง"

"ดังนั้นพวกมันจะประกอบด้วย 0 และ 1 เท่านั้น?"

"ถูกต้อง เพื่อให้คอมไพเลอร์ Javaเข้าใจว่ารหัสประกอบด้วยตัวอักษรตัวเลขที่เข้ารหัสในเลขฐานสองแทนที่จะเป็นเพียงเลขฐานสิบที่ประกอบด้วยศูนย์และเลขหนึ่ง เป็นเรื่องปกติที่ตัวอักษรไบนารีทั้งหมดจะขึ้นต้นด้วยคำนำหน้า 0b ( ' b ' มาจากคำว่า binary)

ตัวอย่าง:

รหัส หมายเหตุ
int x = 0b100; 
x คือ 4: 1*4+0*2+0
int x = 0b1111;
х คือ 15: 1*8+1*4+1*2+1
int x = 0b1111000111; 
х คือ 967: 1*2 9 +1*2 8 +1*2 7 +1*2 6 +0*2 5 +0*2 4 +0*2 3 + 1*2 2 + 1*2+1;
int x = 0b12000;
สิ่งนี้จะไม่คอมไพล์: 2 ไม่ใช่หนึ่งในสัญลักษณ์ที่ใช้ในการเข้ารหัสไบนารี

การเข้ารหัสเลขฐานสิบหก

"สองยกกำลังสี่คืออะไร"

“สิบหก คุณคิดคำถามถูกแล้วที่จะถามหุ่นยนต์ที่มาไกลอย่างฉัน!”

"ดูเหมือนว่าคุณมาไกลแล้ว อย่างไรก็ตาม สิบหก นอกจากการเข้ารหัสเลขฐานแปดและเลขฐานสองแล้ว ตัวอักษรยังสามารถเขียนเป็นเลขฐานสิบหกได้ นี่เป็นการเข้ารหัสที่นิยมมาก

"นั่นเป็นเพราะแม้ว่าสัญลักษณ์เลขฐานสองจะใกล้เคียงกับวิธีการเก็บตัวเลขจริงๆ มากที่สุดเท่าที่จะเป็นไปได้ แต่ก็ยากเกินไปสำหรับมนุษย์ที่จะทำงานกับตัวเลขดังกล่าวอย่างมีประสิทธิภาพ: ในเลขฐานสอง ตัวเลข 1 ล้าน 20 หลัก ไม่ใช่ 7

"นั่นเป็นเหตุผลที่โปรแกรมเมอร์คิดระบบเลขฐานสิบหกขึ้นมา เพราะอย่างที่คุณสังเกตถูกต้อง 16 คือ 2 ยกกำลัง 4 ดังนั้น 4 บิตจึงตรงกับเลขฐานสิบหกหนึ่งหลัก

"ตอนนี้ทุกๆ 4 บิตสามารถเขียนเป็นเลขฐานสิบหกตัวเดียวได้"

"ถูกต้อง การเข้ารหัสเลขฐานสิบหกยังมีคำนำหน้าเฉพาะของตัวเอง: 0xตัวอย่าง:

เลขฐานสิบ สัญกรณ์ไบนารี สัญกรณ์เลขฐานสิบหก
17 0b 0001 0001 0x 1 1
4 1 0b 0010 1 00 1 0x 2 9
85 0b 0101 0101 0x 5 5
256 0b 1 0000 0000 0x 1 0 0

"โอเค ชัดเจนเพียงพอแล้วว่าเราได้ระบบเลขฐานแปดมาได้อย่างไร เราเพิ่งโยนเลข 8 และ 9 ออกไป แต่เราจะเอาเลข 6 หลักที่หายไปสำหรับระบบเลขฐานสิบหกได้ที่ไหน ฉันอยากเห็นมัน!"

"ตรงไปตรงมาทั้งหมด ตัวอักษร 6 ตัวแรกของตัวอักษรภาษาอังกฤษถูกนำมาเป็นตัวเลข 6 ตัวที่หายไป: A (10), B (11), C (12), D (13), E (14), F (15) .

ตัวอย่าง:

สัญกรณ์เลขฐานสิบหก สัญกรณ์ไบนารี เลขฐานสิบ
0x 1 0b 0000 0001 1
0x9 _ 0b 0000 1001 9
0x เอ 0b 0000 1010 10
0x 0b 0000 1011 11
0x ซี 0b 0000 1100 12
0x 0b 0000 1101 13
0x อี 0b 0000 1110 14
0x เอฟ 0b 0000 1111 15
0x 1 0b 0001 1111 31
0x เอเอ 0b 1010 1111 175
0x เอฟเอฟ 0b 1111 1111 255
0x ก กก ก 0b 1111 1111 1111 4095

"คุณจะแปลงเลขฐานสิบหกเป็นทศนิยมได้อย่างไร"

"มันง่ายมาก สมมติว่าคุณมีเลข0 x A F C Fจำนวนนั้นอยู่ในทศนิยม อันดับแรก เรามีระบบเลขตำแหน่ง ซึ่งหมายความว่าส่วนร่วมของแต่ละหลักในจำนวนทั้งหมดจะเพิ่มขึ้นตามปัจจัยของ 16 ขณะที่เราเคลื่อนจากขวาไปซ้าย:

* 16 3 + * 16 2 + * 16 1 +

สัญลักษณ์ A หมายถึงเลข 10 ตัวอักษร C หมายถึงเรามีเลข 12 และตัวอักษร F หมายถึงสิบห้า เราได้รับ:

10 * 16 3 + 15 * 16 2 + 12 * 16 1 + 15

การยก 16 ให้เป็นพลังต่าง ๆ ที่สอดคล้องกับตัวเลข เราได้รับ:

10 * 4096 + 15 * 256 + 12 * 16 + 15

เราสรุปทุกอย่างและรับ:

45007

"ตอนนี้คุณรู้แล้วว่า 45007 ถูกเก็บไว้ในหน่วยความจำอย่างไร"

"ใช่ มันคือ0x A F C F "

"ตอนนี้มาแปลงเป็นเลขฐานสอง ในเลขฐานสองจะเป็น:

0b 1010 1111 1100 1111

"ทุกชุดของสี่บิตสอดคล้องกับอักขระเลขฐานสิบหกหนึ่งตัว สะดวกมาก โดยไม่ต้องคูณหรือยกกำลัง"