คำก่อนหน้านี้
ตัวดำเนินการบิตนั้นมีการดำเนินงานพื้นฐานมากและไม่ได้ใช้กันทั่วไปเพราะมันไม่ได้ใช้งานง่าย อย่างไรก็ตามมันเร็วมากและสามารถบรรลุผลลัพธ์ที่ดีเมื่อใช้อย่างสมเหตุสมผล บทความนี้จะแนะนำตัวดำเนินการที่ถูกมองข้ามบ่อยครั้งใน JavaScript - Bit Operator
การเป็นตัวแทนไบนารี
ค่าทั้งหมดใน eCmascript จะถูกเก็บไว้ในรูปแบบ IEEE-754 64 บิต แต่ตัวดำเนินการบิตไม่ได้ใช้งานโดยตรง 64 บิต แต่คำนวณเป็นจำนวนเต็มที่ลงนาม 32 บิตและค่าส่งคืนยังเป็นจำนวนเต็มที่ลงนาม 32 บิต
การแปลงบิตนี้ช่วยให้ทั้งสองค่าได้รับการปฏิบัติเป็น 0 เมื่อใช้การดำเนินการบิตกับค่า NAN พิเศษและค่าอินฟินิตี้
หากตัวดำเนินการบิตถูกนำไปใช้กับค่าที่ไม่ใช่ตัวเลขค่าจะถูกแปลงเป็นค่าตัวเลขโดยใช้หมายเลข () ก่อนและผลลัพธ์เป็นค่าตัวเลข
- หมายถึง bitwise หรือ, จำนวนเต็มและ 0 bitwise หรือการดำเนินการสามารถรับตัวเองและทศนิยมและ 0 bitwise หรือการทำงานสามารถได้รับเอฟเฟกต์การปัดเศษคอนโซล log (1.3 | 0); // 1console.log (1.8 | 0); // 1console.log | 0); // 0console.log ('12px' | 0); // 0console.log ('12 '| 0); // 12จำนวนเต็มที่ลงนามใช้ 31 แรกของ 32 บิตเพื่อแสดงค่าจำนวนเต็ม, 32 บิตเพื่อแสดงสัญลักษณ์จำนวนเต็ม, 0 แสดงถึงจำนวนบวกและ 1 หมายถึงจำนวนลบ บิตที่แทนสัญลักษณ์เรียกว่าบิตเครื่องหมายและค่าของบิตเครื่องหมายกำหนดรูปแบบของค่าบิตอื่น ในหมู่พวกเขาจำนวนบวกจะถูกเก็บไว้ในรูปแบบไบนารีบริสุทธิ์และแต่ละ 31 บิตแสดงถึงพลังของ 2 บิตแรก (เรียกว่าบิต 0) หมายถึง 0 ครั้งของ 2 บิตที่สองแสดงถึง 1 ครั้งของ 2 และอื่น ๆ บิตที่ไม่ได้ใช้นั้นเต็มไปด้วย 0 นั่นคือพวกเขาจะถูกละเว้น
ตัวอย่างเช่นการเป็นตัวแทนไบนารีของค่าตัวเลข 18 คือ 00000000000000000000000000001001010 หรือยิ่งรัดกุมมากขึ้น 10010 เหล่านี้คือ 5 บิตที่ถูกต้องและ 5 บิตเหล่านี้กำหนดค่าจริง
console.log ((18) .tostring (2)); // "10010"
console.log (0b00000000000000000000000000000000001001010); // 18
ตัวเลขเชิงลบจะถูกเก็บไว้ในไบนารี แต่รูปแบบที่ใช้อยู่ในส่วนประกอบของสอง ในการคำนวณส่วนประกอบของสองตัวเลขคุณต้องผ่าน 3 ขั้นตอนต่อไปนี้:
【 1 】ค้นหารหัสไบนารีของค่าสัมบูรณ์ของค่าตัวเลขนี้
【 2 】ค้นหารหัสผกผันไบนารีนั่นคือแทนที่ 0 ด้วย 1 แทนที่ 1 ด้วย 0
【 3 】รหัสผกผันไบนารีที่ได้รับจะถูกเพิ่มลงใน 1
ตัวอย่างเช่นในการพิจารณาการเป็นตัวแทนไบนารีของ -18 คุณต้องได้รับการแสดงแบบไบนารี 18 ดังที่แสดงด้านล่าง:
0000 0000 0000 0000 0000 0000 0001 0010
ถัดไปคำนวณรหัสผกผันไบนารีดังนี้:
1111 1111 1111 1111 1111 1111 1111 1110 1101
ในที่สุดเพิ่ม 1 ลงในรหัสผกผันไบนารีดังต่อไปนี้:
1111 1111 1111 1111 1111 1111 1110 1101 1 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -
ดังนั้นการเป็นตัวแทนไบนารีของ -18 คือ 1111 1111 1111 1111 1111 1111 1111 1111 1111 1110 1110
Ecmascript จะพยายามอย่างเต็มที่เพื่อซ่อนข้อมูลทั้งหมดนี้จากเรา เมื่อเอาท์พุทจำนวนลบในรูปแบบของสตริงไบนารีสิ่งที่เราเห็นก็คือรหัสไบนารีที่มีค่าสัมบูรณ์ของจำนวนลบนี้จะถูกนำหน้าด้วยเครื่องหมายลบ
var num = -18; console.log (num.toString (2)); // ' -10010'
ตัวดำเนินการบิตสามารถดำเนินการ 7 ประเภทรวมถึง bitwise non (ไม่), bitwise และ (และ), bitwise หรือ (หรือ), bitwise exclusive หรือ (xor), กะซ้าย, กะขวาที่ลงนามและกะขวาที่ไม่ได้ลงชื่อ
bitwise ไม่ใช่ (ไม่)
Bitwise Non-Operator จะแสดงด้วยเส้นหยัก (~) ผลลัพธ์ของการดำเนินการบิตที่ไม่ใช่ผู้ดำเนินการคือการส่งคืนรหัสผกผันของค่า สาระสำคัญของมันคือลบค่าลบของตัวถูกดำเนินการโดย 1
var num1 = 25; var num2 = ~ num1; console.log (num2); //-26
คุณสามารถรับเอฟเฟกต์การปัดเศษได้ด้วยสองครั้งสำหรับจำนวนเต็ม คุณสามารถรับเอฟเฟกต์การปัดเศษได้ด้วยทศนิยมสองครั้งสำหรับทศนิยม
console.log (~~ 3); // 3console.log (~~ 3.1); // 3console.log (~~ 3.9); // 3
bitwise และ (และ)
Bitwise และ Operator แสดงด้วยสัญลักษณ์ผลรวม (&) ซึ่งมีหมายเลขผู้ให้บริการสองหมายเลข โดยพื้นฐานแล้ว bitwise และการดำเนินการคือการจัดแนวแต่ละบิตของค่าสองค่าจากนั้นดำเนินการและการดำเนินการกับสองตัวเลขที่ตำแหน่งเดียวกันตามกฎในตารางต่อไปนี้
บิตค่าแรกของบิตค่าที่สองผลลัพธ์ 1 1 11 0 00 1 00 0 0 0 0 0
Bitwise และการดำเนินการจะส่งคืน 1 เฉพาะในกรณีที่บิตที่สอดคล้องกันของค่าทั้งสองคือ 1 บิตใด ๆ คือ 0 และผลลัพธ์คือ 0
var iresult = 25 & 3; console.log (iresult); // "1"
// การวิเคราะห์มีดังนี้ 25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001
bitwise หรือ (หรือ)
Bitwise หรือ Operator แสดงด้วยสัญลักษณ์แนวตั้ง (|) และยังมีตัวถูกดำเนินการสองตัว bitwise หรือการดำเนินการตามตารางความจริงต่อไปนี้
บิตค่าแรกของบิตค่าที่สองผลลัพธ์ 1 1 11 0 10 1 10 0 0 0 0
Bitwise หรือการดำเนินการส่งคืน 1 ถ้าหนึ่งบิตคือ 1 และเฉพาะในกรณีที่บิตทั้งสองเป็น 0
var iresult = 25 | 3; console.log (iresult); // "27"
// การวิเคราะห์มีดังนี้ 25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0000 0001 1011
จำนวนเต็มและ 0 bitwise หรือการทำงานสามารถรับได้และทศนิยมและ 0 บิตหรือการดำเนินการหรือการดำเนินการสามารถรับเอฟเฟกต์การปัดเศษ
console.log (3.1 | 0); // 3console.log (3.9 | 0); // 3
bitwise xor (xor)
ตัวดำเนินการ XOR Bitwise แสดงโดย Caret (^) และมีตัวถูกดำเนินการสองตัว ต่อไปนี้เป็นตารางความจริงของ bitwise xor
บิตของค่าแรกบิตของค่าที่สอง 1 1 01 0 10 1 10 0 0 0 0
ส่งคืน 0 เมื่อค่าสองค่าของ bitwise xor เหมือนกันและส่งคืน 1 เมื่อไม่ได้ในเวลาเดียวกัน
var iresult = 25 ^ 3; console.log (iresult); // "26"
// การวิเคราะห์มีดังนี้ 25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0000 0001 1010
"Exoroor Operation" มีการใช้งานพิเศษซึ่งทำการดำเนินการ XOR สามครั้งในสองตัวเลข A และ B อย่างต่อเนื่อง, Aˆ = B, Bˆ = A, Aˆ = B และค่าของพวกเขาสามารถเปลี่ยนได้ ซึ่งหมายความว่าการใช้ "เอกสิทธิ์หรือการดำเนินการ" สามารถแลกเปลี่ยนค่าของตัวแปรสองตัวโดยไม่ต้องแนะนำตัวแปรชั่วคราว
var a = 10, b = 9; a ^= b, b ^= a, a ^= b; console.log (a, b); // 9,10
// การวิเคราะห์มีดังนี้ A = 0000 0000 0000 0000 0000 0000 0000 0000 1010 B = 0000 0000 0000 0000 0000 0000 0000 0000 000000000000000000000000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0 1001 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -
จำนวนเต็มที่มี 0 Bitwise XOR สามารถรักษาตัวเองได้และทศนิยมที่มี 0 Bitwise XOR สามารถปัดเศษได้
console.log (3.1 ^ 0); // 3console.log (3.9 ^ 0); // 3
ย้ายไปทางซ้าย
ตัวดำเนินการกะซ้ายแสดงโดยสองสัญญาณน้อยกว่า (<<) ตัวดำเนินการนี้จะย้ายบิตทั้งหมดของค่าไปทางซ้ายโดยจำนวนบิตที่ระบุ
ตัวอย่างเช่นหากค่า 2 (รหัสไบนารีคือ 10) เปลี่ยน 5 บิตไปทางซ้ายผลลัพธ์คือ 64 (10,00000)
var oldValue = 2; var newValue = oldValue << 5; console.log (newValue); // 64
การเคลื่อนที่ไปทางซ้ายจะไม่ส่งผลกระทบต่อบิตสัญญาณของตัวถูกดำเนินการ กล่าวอีกนัยหนึ่งถ้า -2 ถูกย้าย 5 บิตไปทางซ้ายผลลัพธ์จะเป็น -64
var oldValue = -2; var newValue = oldValue << 5; console.log (newValue); // -64
การเลื่อนซ้าย 0 บิตสามารถบรรลุเอฟเฟกต์การปัดเศษ
console.log (3.1 << 0); // 3console.log (3.9 << 0); // 3
ลงนามขวา
ตัวดำเนินการที่มีการเลื่อนขวาที่ลงนามนั้นแสดงโดยสองสัญญาณมากกว่าสัญญาณ (>>) ซึ่งย้ายค่าไปทางขวา แต่ยังคงรักษาบิตป้าย (เช่นเครื่องหมายลงชื่อ) การดำเนินการกะขวาที่ลงนามนั้นตรงข้ามกับการทำงานกะซ้ายนั่นคือถ้า 64 ถูกย้าย 5 บิตไปทางขวาผลลัพธ์จะถูกเปลี่ยนกลับเป็น 2
var oldValue = 64; var newValue = oldValue >> 5; console.log (newValue); // 2
ในทำนองเดียวกันในระหว่างกระบวนการเปลี่ยนตำแหน่งตำแหน่งว่างจะปรากฏในค่าดั้งเดิม อย่างไรก็ตามคราวนี้ตำแหน่งที่ว่างจะปรากฏขึ้นที่ด้านซ้ายของค่าดั้งเดิมและทางด้านขวาของบิตป้าย ในเวลานี้ Ecmascript จะเติมช่องว่างทั้งหมดด้วยค่าของบิตป้ายเพื่อรับค่าที่สมบูรณ์
ย้ายขวาเพื่อจำลองการทำงานของตัวหาร 2
console.log (5 >> 1); // 2console.log (15 >> 1); // 7
สิทธิที่ไม่ได้ลงนาม
ตัวดำเนินการ Shift Right ที่ไม่ได้ลงนามนั้นแสดงโดย 3 สัญญาณที่ใหญ่กว่า (>>>) ซึ่งเคลื่อนย้ายค่าทั้งหมด 32 บิตไปทางขวา สำหรับจำนวนบวกผลลัพธ์ของการเปลี่ยนแปลงขวาที่ไม่ได้ลงนามนั้นเหมือนกับการเปลี่ยนแปลงขวาที่ลงนาม มันสะดวกที่จะย้ายป้ายตรงหน้า หากคุณย้าย 64 ถึง 5 บิตที่ไม่ได้ลงนามผลลัพธ์จะยังคงเป็น 2
var oldValue = 64; var newValue = oldValue >>> 5; console.log (newValue); // 2
อย่างไรก็ตามจำนวนลบแตกต่างกัน ขั้นแรกให้กะขวาที่ไม่ได้ลงชื่อเติมเต็มบิตที่ว่างเปล่าด้วย 0 แทนที่จะเติมบิตที่ว่างเปล่าด้วยค่าของบิตที่ลงนามเช่นกะขวาที่ลงนาม ดังนั้นผลลัพธ์ของการเปลี่ยนแปลงขวาที่ไม่ได้ลงนามไปยังจำนวนบวกจึงเหมือนกับผลของการเปลี่ยนชื่อเป็นชื่อ แต่ผลลัพธ์ของจำนวนลบจะแตกต่างกัน ประการที่สองผู้ประกอบการกะขวาที่ไม่ได้ลงนามจะถือว่ารหัสไบนารีเชิงลบเป็นรหัสไบนารีบวก ยิ่งไปกว่านั้นเนื่องจากจำนวนลบจะถูกแสดงในส่วนประกอบของทั้งสองของค่าสัมบูรณ์ผลลัพธ์จะมีขนาดใหญ่มากหลังจากการเปลี่ยนแปลงขวาที่ไม่ได้ลงนาม
var oldValue = -64; var newValue = oldValue >>> 5; console.log (newValue) // 134217726
ในการพิจารณาการเป็นตัวแทนไบนารีของ -64 คุณต้องได้รับการแสดงไบนารี 64 ดังที่แสดงด้านล่าง:
0000 0000 0000 0000 0000 0000 0100 0000
ถัดไปคำนวณรหัสผกผันไบนารีดังนี้:
1111 1111 1111 1111 1111 1111 1111 1011 11111
สุดท้ายเพิ่ม 1 ลงในรหัสผกผันไบนารีดังที่แสดงด้านล่าง
1111 1111 1111 1111 1111 1111 1111 1011 1111 1 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
หลังจากขยับ 5 บิตไปทางขวาดังที่แสดงด้านล่าง:
0000 0111 1111 1111 1111 1111 11111 11111 1110console.log (0B00000111111111111111111111111111111111111111111111111111111111111
แอปพลิเคชันทั่วไป
【 1 】การดำเนินการหลายครั้ง
ใช้การเลื่อนซ้าย (<<) เพื่อรับรู้การคูณการคูณ
console.log (2 << 1); // 4console.log (3 << 1); // 6console.log (4 << 1); // 8
【 2 】หารการดำเนินการ
ใช้ Shift Signed Right (>>) เพื่อจำลองการทำงานของตัวหาร 2
console.log (2 >> 1); // 1console.log (5 >> 1); // 2console.log (8 >> 1); // 4console.log (9 >> 1); // 4console.log (9 >> 1);
【 3 】การแลกเปลี่ยนค่า
ผลกระทบของการแลกเปลี่ยนค่าสามารถทำได้โดยใช้การดำเนินการ XOR (^)
var a = 10, b = 9; a ^= b, b ^= a, a ^= b; console.log (a, b); // 9,10
【 4 】สรุปทศนิยม
เอฟเฟกต์การปัดเศษทศนิยมสามารถทำได้โดยใช้สองบิตที่ไม่ใช่บิต, 0 บิตหรือ 0 บิตหรือ 0 บิตซ้ายและ 0 บิตขวา
console.log (~~ 3.1); // 3console.log (3.1 | 0); // 3console.log (3.1^0); // 3console.log (3.1 << 0); // 3console.log (3.1 >> 0); // 3console.log (3.1 >> 0);
【 5 】สวิตช์
ตัวดำเนินการบิตสามารถใช้เป็นสวิตช์เพื่อตั้งค่าคุณสมบัติวัตถุ สมมติว่าวัตถุมีสวิตช์สี่สวิตช์แต่ละสวิตช์เป็นตัวแปร จากนั้นคุณสามารถตั้งค่าหมายเลขไบนารีสี่บิตซึ่งแต่ละอันสอดคล้องกับสวิตช์
var flag_a = 1; // 0001VAR FLAG_B = 2; // 0010VAR FLAG_C = 4; // 0100VAR FLAG_D = 8; // 1,000
โค้ดด้านบนตั้งค่าสวิตช์สี่สวิตช์ A, B, C และ D แต่ละสวิตช์มีบิตไบนารีตามลำดับ
ตอนนี้สมมติว่าต้องเปิดสวิตช์ ABD ทั้งสามตัวเราสามารถสร้างตัวแปรหน้ากากได้
var mask = flag_a | Flag_b | flag_d; // 0001 | 0010 | 1000 => 1011
รหัสข้างต้นดำเนินการ "หรือการดำเนินการ" บนตัวแปรสามตัว ABD เพื่อให้ได้ 1011 ด้วยค่าหน้ากากของไบนารี
// "การดำเนินการ" ทำให้มั่นใจได้ว่าสวิตช์ที่ระบุจะถูกเปิดใช้งาน Flags = Flags | หน้ากาก;
// "การเชื่อมโยง" สามารถปิดรายการทั้งหมดในการตั้งค่าปัจจุบันที่แตกต่างจากการตั้งค่าสวิตช์ Flags = Flags & Mask;
// "เอกสิทธิ์เฉพาะบุคคลหรือการดำเนินการ" สามารถสลับไปเป็น (สลับ) การตั้งค่าปัจจุบันนั่นคือค่าย้อนกลับของการตั้งค่าปัจจุบันสามารถรับได้เป็นครั้งแรกและสามารถรับค่าดั้งเดิมได้โดยการดำเนินการอีกครั้ง ธง = ธง ^ หน้ากาก;
// "ไม่มีการดำเนินการ" สามารถพลิกการตั้งค่าปัจจุบันนั่นคือการตั้งค่าดั้งเดิมคือ 0 และจะกลายเป็น 1 หลังจากการดำเนินการ; การตั้งค่าดั้งเดิมคือ 1 และจะกลายเป็น 0flags หลังจากการดำเนินการ = ~ แฟล็ก;
การแนะนำที่ครอบคลุมข้างต้นเกี่ยวกับตัวดำเนินการ JavaScript - Bit Operator คือเนื้อหาทั้งหมดที่แชร์โดยตัวแก้ไข ฉันหวังว่ามันจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น