ตัวดำเนินการ Bitwise ในการเขียนโปรแกรม C & C ++
เผยแพร่แล้ว: 2022-12-09ใน RAM ข้อมูลจะถูกจัดเรียงเป็นลำดับของไบต์ ทุกไบต์มีแปดบิตต่อเนื่องกัน ตัวดำเนินการระดับบิต ของ C & C++ มีประโยชน์เมื่อคุณต้องการดำเนินการทางคณิตศาสตร์กับบิตของข้อมูล พวกมันค่อนข้างเร็วกว่าและบางครั้งก็ใช้เพื่อเพิ่มประสิทธิภาพของโปรแกรม พวกเขาทำงานบนอัลกอริทึม Bitwise ที่ดำเนินการในระดับบิตหรือจัดการบิตในรูปแบบต่างๆ
ประเภทของ Bitwise Operator ใน C & C++:
- ในระดับบิตและ
- ในระดับบิตหรือ
- บิตไม่
- Bitwise Exclusive-Or (XOR)
- ตัวดำเนินการกะซ้าย
- ตัวดำเนินการ Shift ขวา
มาดูรายละเอียดของแต่ละคนกัน:
สารบัญ
1. บิตและ:
ตัวดำเนินการระดับบิตและใน C หรือ C++ ใช้เครื่องหมายแอมเปอร์แซนด์ (&) ตัวเดียว ใช้ตัวเลขสองตัวเป็นตัวถูกดำเนินการและดำเนินการ AND กับบิตทั้งหมด ผลลัพธ์จะเป็น 1 ก็ต่อเมื่อบิตทั้งสองเป็น 1 หากบิตใดเป็น 0 ผลลัพธ์จะเป็น 0 โดยหลักแล้ว ตัวดำเนินการไบนารี ใน C & C++ จะใช้ตรรกะ AND ของบิตในทุกตำแหน่งของตัวเลขสองตัวที่กำหนดใน รูปแบบไบนารี
ตัวอย่าง:
สมมติว่าการแทนเลขฐานสองของตัวเลขสองตัว a & b คือ:
ก = 01011000
ข = 10111001
ดังนั้น a & b = 00011000
ดังที่เห็นจากตัวอย่างข้างต้น ผลลัพธ์จะแสดง '1' เฉพาะในตำแหน่งที่ทั้งตัวเลข a และ b มี 1 สำหรับตำแหน่งอื่นทั้งหมด ผลลัพธ์จะแสดงเป็น '0'
2. บิตหรือ:
ใน C & C++ Bitwise OR ทำงานค่อนข้างคล้ายกับ bitwise AND ข้อแตกต่างเพียงอย่างเดียวคือในตัวดำเนินการระดับบิตหรือ OR เพื่อให้ตำแหน่งของบิตเป็น '1' ในผลลัพธ์ มีเพียงหนึ่งในสองบิตเท่านั้นที่ควรเป็น '1' ตัวดำเนินการนี้ใช้ตัวเลขสองตัวเป็นตัวถูกดำเนินการและดำเนินการ OR กับทุกๆ บิตของตัวเลขสองตัว
มันทำงานในลักษณะต่อไปนี้:
- หากทั้งสองบิตเป็น '1' ผลลัพธ์คือ '1'
- หากทั้งสองบิตเป็น '0' ผลลัพธ์คือ '0'
- หากบิตใดเป็น '1' ผลลัพธ์คือ '1'
เป็นหนึ่งใน ตัวดำเนินการระดับบิตของ C++ ที่ง่ายและใช้บ่อยที่สุด สัญลักษณ์ของมันคือท่อ |. นอกจากนี้ ยังเหมือนกับตัวดำเนินการตรรกะบูลีน ||
ตัวอย่าง:
สมมติว่าการแทนเลขฐานสองของตัวเลขสองตัว a| ข คือ:
ก = 01101001
ข = 10111000
ดังนั้น ก| ข = 11111001
3. ไม่ระดับบิต:
หรือที่เรียกว่าตัวดำเนินการ Bitwise NOT ซึ่งจะพลิกทุกบิตในผลลัพธ์ สัญลักษณ์ของมันคือตัวหนอน (~) วิธีง่ายๆ ในการจดจำการทำงานของตัวดำเนินการนี้คือ ตัวหนอนบางครั้งเรียกว่า twiddle และส่วนเสริมระดับบิตจะ twiddle ทีละบิต หมายความว่าถ้าคุณมี 1 ผลลัพธ์จะเป็น 0 และในทางกลับกัน กล่าวอีกนัยหนึ่ง ตัวดำเนินการระดับบิตใน C & C++ จะใช้ตัวเลขหนึ่งตัวและสลับบิตทั้งหมด
เมื่อกำหนดค่าที่ใหญ่ที่สุดที่เป็นไปได้สำหรับหมายเลขที่ไม่ได้ลง นาม ค่านี้เป็นหนึ่งใน ตัวดำเนินการระดับบิต C++ ที่มีประโยชน์มากที่สุด
ตัวอย่าง:
int num ที่ไม่ได้ลงชื่อ = ~0;
ในที่นี้ 0 หมายถึง 0 ทั้งหมด: 00000000 ดังนั้น การใช้ตัวดำเนินการ Bitwise NOT จะให้ผลลัพธ์เป็น 1 วินาที: 11111111 เนื่องจาก num เป็น int ที่ไม่ได้ลงนาม คุณจึงไม่ต้องกังวลเกี่ยวกับบิตเครื่องหมายหรือสองส่วนเติมเต็ม 1s เป็นจำนวนที่มากที่สุดที่เป็นไปได้ในผลลัพธ์
ลักษณะสำคัญอย่างหนึ่งของตัวดำเนินการ Bitwise NOT คือ 2's Complement ส่วนเติมเต็มของ 2 เท่ากับส่วนเติมเต็มของจำนวนนั้นบวก 1
ตัวอย่าง:
ก = 00000000
ดังนั้น 2 ส่วนประกอบ = -(11111111+1) = -00000000 = -0(ทศนิยม)
หมายเหตุ: ส่วนเติมเต็มระดับบิตของจำนวน N ใดๆ เท่ากับ -(N+1)
เรียนรู้หลักสูตรการพัฒนาซอฟต์แวร์ออนไลน์จากมหาวิทยาลัยชั้นนำของโลก รับโปรแกรม PG สำหรับผู้บริหาร โปรแกรมประกาศนียบัตรขั้นสูง หรือโปรแกรมปริญญาโทเพื่อติดตามความก้าวหน้าในอาชีพของคุณอย่างรวดเร็ว
4. Bitwise Exclusive-OR (XOR):
การดำเนินการ Exclusive-OR ยอมรับสองอินพุตและเอาต์พุต a 1 หากอินพุตตัวใดตัวหนึ่งหรือตัวอื่นเป็น 1 แต่ผลลัพธ์จะเป็น 0 หากทั้งคู่เป็น 1 หากอินพุตทั้งคู่เป็น 0 หรือทั้งคู่เป็น 1 ผลลัพธ์คือ 0 ผลลัพธ์ ของ XOR เป็น 1 ก็ต่อเมื่อทั้งสองบิตต่างกัน สัญลักษณ์ของ ตัวดำเนินการไบนารีในภาษา C & C++ คือเครื่องหมายคาเร็ต (^) นอกจากนี้ ตัวดำเนินการระดับบิตใน C & C++ นี้ มีชื่อย่อว่า XOR มันดำเนินการเอกสิทธิ์เฉพาะหรือกับทุกคู่ของบิต โปรดทราบว่าไม่มีตัวดำเนินการบูลีนที่เทียบได้กับตัวดำเนินการนี้
ตัวอย่าง:
สมมติว่าเรามีตัวเลขสองตัวเป็น
ก = 10101010
ข = 01110010
ตอนนี้ a^b = 10101010 ^ 01110010 = 11011000
คุณสามารถเข้าใจ XOR ด้วยวิธีต่อไปนี้ สมมติว่าคุณมีบิต 0 หรือ 1 ที่คุณเรียกว่า A ตอนนี้เมื่อคุณใช้ A XOR 0 คุณจะได้ A กลับมา ดังนั้น ถ้า A เป็น 1 คุณจะได้ 1 และในทางกลับกัน เมื่อคุณหา A XOR 1 หมายความว่าคุณพลิก A ดังนั้น ถ้า A เป็น 1 คุณจะได้ 0 และกลับกัน
หากคุณใช้การดำเนินการ XOR ระดับบิตสองครั้ง กล่าวคือ คุณมีสองบิต A และ B และคุณตั้งค่า C = A XOR B จากนั้นดำเนินการ C XOR B ในกรณีนั้น ผลลัพธ์ที่คุณได้รับคือ A XOR B XOR C มันพลิกแต่ละบิตของ A สองครั้งหรือไม่พลิกเลยสักนิด ดังนั้น คุณเพียงแค่ได้ A กลับมาเหมือนเดิม
คุณสามารถพิจารณาการดำเนินการ XOR แบบไบนารีเป็นประเภทของการบิดแบบเลือกได้ หากคุณใช้ XOR กับตัวเลขสองตัว ซึ่งหนึ่งในจำนวนนั้นเป็น 1 ทั้งหมด ผลลัพธ์ที่ได้จะเทียบเท่ากับ twiddle
5. ตัวดำเนินการกะซ้าย:
ตัวดำเนินการระดับบิตนี้เลื่อนบิตทั้งหมดไปทางซ้ายตามจำนวนบิตที่ระบุ ตำแหน่งบิตที่ตัวดำเนินการ shift ซ้ายว่างเปล่าจะถูกเติมด้วย 0 สัญลักษณ์ของมันคือ <<
ใน C หรือ C++ นั้นทำงานโดยใช้ตัวเลขสองตัว เลื่อนบิตของตัวถูกดำเนินการตัวแรกไปทางซ้าย และตัวถูกดำเนินการตัวที่สองระบุจำนวนตำแหน่งที่จะเลื่อนตัวเลข
ไวยากรณ์:
<<= 5
นี่คือตัวอย่างโปรแกรม C/C++ เพื่อใช้งานตัวดำเนินการกะซ้าย:
int หลัก ()
{
int = 5;
<<= 2;
นับ << “x : ” << x << endl;
}
เอาต์พุต: a = 20
หลักสูตรและบทความยอดนิยมเกี่ยวกับวิศวกรรมซอฟต์แวร์
โปรแกรมยอดนิยม | |||
โปรแกรม Executive PG ในการพัฒนาซอฟต์แวร์ - IIIT B | โปรแกรมใบรับรอง Blockchain - PURDUE | โปรแกรมใบรับรองความปลอดภัยทางไซเบอร์ - PURDUE | MSC ในวิทยาการคอมพิวเตอร์ - IIIT B |
บทความยอดนิยมอื่น ๆ | |||
เงินเดือนวิศวกรคลาวด์ในสหรัฐอเมริกา 2021-22 | เงินเดือนสถาปนิกโซลูชัน AWS ในสหรัฐอเมริกา | เงินเดือนนักพัฒนาแบ็กเอนด์ในสหรัฐอเมริกา | เงินเดือนนักพัฒนาส่วนหน้าในสหรัฐอเมริกา |
เงินเดือนนักพัฒนาเว็บในสหรัฐอเมริกา | คำถามสัมภาษณ์ Scrum Master ในปี 2022 | จะเริ่มอาชีพใน Cyber Security ในปี 2565 ได้อย่างไร | ตัวเลือกอาชีพในสหรัฐอเมริกาสำหรับนักศึกษาวิศวกรรม |
6. ตัวดำเนินการกะขวา:
ตัวดำเนินการระดับบิตนี้เลื่อนบิตทั้งหมดไปทางขวาตามจำนวนบิตที่ระบุ สัญลักษณ์คือ >>. ใน C หรือ C++ โอเปอเรเตอร์นี้จะใช้ตัวเลขสองตัว เลื่อนบิตของตัวถูกดำเนินการตัวแรกไปทางขวา และตัวถูกดำเนินการที่สองระบุจำนวนการเลื่อนของตัวเลข
ไวยากรณ์:
ก >>= 5
ตัวอย่างโปรแกรม C/C++ เพื่อใช้งานตัวดำเนินการ shift ขวา:
int หลัก () {
int = 5;
ก >> = 2;
นับ << “x : ” << x << endl;
}
เอาต์พุต: a = 1
หลักสูตรและบทความยอดนิยมเกี่ยวกับวิศวกรรมซอฟต์แวร์
โปรแกรมยอดนิยม | |||
โปรแกรม Executive PG ในการพัฒนาซอฟต์แวร์ - IIIT B | โปรแกรมใบรับรอง Blockchain - PURDUE | โปรแกรมใบรับรองความปลอดภัยทางไซเบอร์ - PURDUE | MSC ในวิทยาการคอมพิวเตอร์ - IIIT B |
บทความยอดนิยมอื่น ๆ | |||
เงินเดือนวิศวกรคลาวด์ในสหรัฐอเมริกา 2021-22 | เงินเดือนสถาปนิกโซลูชัน AWS ในสหรัฐอเมริกา | เงินเดือนนักพัฒนาแบ็กเอนด์ในสหรัฐอเมริกา | เงินเดือนนักพัฒนาส่วนหน้าในสหรัฐอเมริกา |
เงินเดือนนักพัฒนาเว็บในสหรัฐอเมริกา | คำถามสัมภาษณ์ Scrum Master ในปี 2022 | จะเริ่มอาชีพใน Cyber Security ในปี 2565 ได้อย่างไร | ตัวเลือกอาชีพในสหรัฐอเมริกาสำหรับนักศึกษาวิศวกรรม |
เมื่อใดที่คุณควรใช้ตัวดำเนินการระดับบิตใน C & C++
- ประหยัดพื้นที่:
ตัวดำเนินการระดับบิตช่วยประหยัดพื้นที่ ปัญหาหนึ่งที่พบบ่อยเมื่อทำงานในแต่ละระดับบิตคือ ถ้าคุณต้องการพื้นที่เพิ่มหรือเพื่อประหยัดเวลา คุณอาจต้องออกแบบส่วนใหญ่ของโปรแกรมใหม่ แต่การใช้ตัวดำเนินการระดับบิตใน C & C++ สามารถกำจัดการพึ่งพาได้ ตัวอย่างเช่น คุณสามารถใช้ ~0 เพื่อรับจำนวนเต็มที่มากที่สุดเท่าที่จะเป็นไปได้ การเลื่อนบิตเพื่อคูณด้วยสองเป็นการดำเนินการทั่วไป ดังนั้นจึงไม่ส่งผลกระทบต่อความสามารถในการอ่าน ซึ่งแตกต่างจากการใช้ขั้นสูงของการจัดการบิตที่อาจส่งผลกระทบในบางกรณี
- การเข้ารหัส:
หากคุณกำลังทำงานกับการเข้ารหัสบางประเภทหรือบนระบบที่ต้องการฟิลด์บิตเพื่อใช้ในการจัดเก็บแอตทริบิวต์บูลีน
ข้อเท็จจริงที่ไม่ซ้ำใครเกี่ยวกับตัวดำเนินการระดับบิต
- OR ระดับบิตของตัวเลขสองตัวเป็นเพียงผลรวมของตัวเลขเหล่านั้นหากไม่มีการพกพาเข้ามาเกี่ยวข้อง มิฉะนั้นคุณเพียงแค่ต้องเพิ่มบิตและ AND ตัวอย่างเช่น สมมติว่า x = 5(101) และ y = 2(010) เนื่องจากไม่มีการพกพาเข้ามาเกี่ยวข้อง ผลรวมจึงเป็นเพียง x|y แต่ถ้าตอนนี้เราเปลี่ยน 'x' เป็น 6 (110) ผลรวมจะเปลี่ยนเป็น x|y + x&y เพราะตอนนี้มีการพกพาเข้ามาเกี่ยวข้อง
- ตัวดำเนินการ XOR ระดับบิตมีค่ามากที่สุดจากมุมมองการสัมภาษณ์ทางเทคนิค ตัวอย่างของปัญหาในการสัมภาษณ์ที่เกี่ยวข้องกับสิ่งนี้จะกล่าวถึงที่นี่ “สำหรับชุดตัวเลขที่กำหนดซึ่งประกอบด้วยองค์ประกอบทั้งหมดที่เกิดขึ้นเป็นจำนวนคู่ยกเว้นจำนวนเดียว จงหาจำนวนที่เกิดขึ้นเป็นคี่” คุณต้องทำ XOR กับตัวเลขทั้งหมดเพื่อแก้ปัญหานี้
- ห้ามใช้ตัวดำเนินการเลื่อนไปทางขวาและซ้ายสำหรับจำนวนลบ ตัวถูกดำเนินการตัวที่สอง ซึ่งกำหนดจำนวนกะ มีจำนวนลบ ซึ่งนำไปสู่ลักษณะการทำงานที่ไม่ได้กำหนดใน C & C++ ตัวอย่างเช่น ผลลัพธ์ของทั้ง 1 >>- 1 และ 1 << -1 จะไม่ถูกกำหนด
- ลักษณะการทำงานจะไม่ถูกระบุหากการเลื่อนของตัวเลขเกินความจุของจำนวนเต็ม ตัวอย่างเช่น 1 << 65 จะไม่ระบุหากจำนวนเต็มถูกจัดเก็บในรูปแบบ 64 บิต
- การดำเนินการกะจะไม่เกิดขึ้นหากตัวถูกดำเนินการที่สอง (ตัวกำหนดจำนวนกะ) เป็น 0
เริ่มต้นกับเส้นทางวิทยาการคอมพิวเตอร์ของคุณด้วย UpGrad:
หากคุณต้องการเรียนรู้รายละเอียดเกี่ยวกับการพัฒนาส่วนหน้า (JavaScript, HTML, CSS), แบ็กเอนด์ (NoSQL-MongoDB) และไมโครเซอร์วิส คุณสามารถเรียนหลักสูตรวิทยาศาสตรมหาบัณฑิตสาขาวิทยาการคอมพิวเตอร์ของ UpGrad ได้ จัดทำโดย IIIT Bangalore & LJMU Alumni Status หลักสูตรนี้ช่วยให้คุณมีอาชีพเป็นวิศวกรซอฟต์แวร์/นักพัฒนาฟูลสแตกกับยักษ์ใหญ่ด้านเทคโนโลยีทั่วโลก
หลักสูตรนี้ครอบคลุมการเข้าถึง Career Transition Bootcamp ฟรีสำหรับผู้เริ่มต้นและผู้ที่ไม่ใช้เทคโนโลยี คุณจะได้เรียนรู้ภาษาโปรแกรมและเครื่องมือมากกว่า 10 ภาษาในหลักสูตรนี้ เพื่อเตรียมคุณให้พร้อมที่จะรับบทบาทที่ซับซ้อนในอุตสาหกรรมนี้อย่างละเอียด
การใช้ตัวดำเนินการระดับบิตใน C ++ คืออะไร
ใน C++ ตัวดำเนินการระดับบิตจะดำเนินการกับข้อมูลจำนวนเต็มในระดับไบนารี พวกมันทำงานในรูปแบบบิตที่เกี่ยวข้องกับการจัดการแต่ละบิต ดังนั้น การดำเนินการในระดับบิตจึงเรียกอีกอย่างว่าการเขียนโปรแกรมระดับบิต ตัวดำเนินการระดับบิตใน C++ ส่วนใหญ่ใช้สำหรับการคำนวณที่รวดเร็ว เนื่องจากทำงานบนตัวเลขสองหลักเท่านั้น ได้แก่ 0 และ 1 ตัวดำเนินการเหล่านี้ยังสามารถทดสอบและเปลี่ยนบิตจริงได้
คุณสามารถใช้ตัวดำเนินการเลื่อนซ้ายและขวาร่วมกันในรหัสได้หรือไม่?
ได้ คุณสามารถรวมตัวดำเนินการเลื่อนซ้ายและขวาเข้าด้วยกันได้ และหลังจากนั้น คุณสามารถแยกข้อมูลจากนิพจน์จำนวนเต็มได้
ตัวดำเนินการเสริมพลิกลำดับรหัสทั้งหมดหรือไม่
ไม่มันไม่ มันพลิก 1s และ 0s ดังนั้น 1 ทั้งหมดกลายเป็น 0 และในทางกลับกัน
เหตุใดชื่ออื่นของตัวดำเนินการเสริม Bitwise จึงเป็นตัวดำเนินการเสริม
เหตุผลคือต้องใช้ตัวถูกดำเนินการหรือค่าเดียวเท่านั้น เป็นตัวดำเนินการเอกฐาน เมื่อคุณทำการเติมเต็มในบิตใด ๆ 0 ทั้งหมดจะกลายเป็น 1 และในทางกลับกัน ตัวอย่างเช่น หากคุณมีนิพจน์จำนวนเต็มที่มีค่า 1111 0000 หลังจากดำเนินการเสริมระดับบิต ค่าจะกลายเป็น 0000 1111