คำถามติดแท็ก bitwise-operators

ตัวดำเนินการที่ใช้ในการจัดการในระดับบิตภาษาการเขียนโปรแกรมเป็นแบบไบต์ในขณะที่ฮาร์ดแวร์เน้นบิตดังนั้นความสามารถในการทำงานในระดับบิตจึงมีความสำคัญมากในการเขียนโปรแกรมโดยเฉพาะอย่างยิ่งเมื่อโปรแกรมโต้ตอบกับฮาร์ดแวร์โดยตรง .


13
อย่างไร !! ~ (ไม่ใช่เครื่องหมายทิลเดอร์ / แบงแบงทิลเดอร์) เปลี่ยนผลลัพธ์ของการเรียกเมธอดอาร์เรย์ 'มี / รวม' อย่างไร
หากคุณอ่านความคิดเห็นในinArrayหน้าjQuery ที่นี่มีคำประกาศที่น่าสนใจ: !!~jQuery.inArray(elm, arr) ตอนนี้ฉันเชื่อว่าเครื่องหมายอัศเจรีย์คู่จะแปลงผลลัพธ์เป็นประเภทbooleanโดยมีค่าเป็นtrue. สิ่งที่ฉันไม่เข้าใจคือการใช้ตัวดำเนินการ tilde ( ~) ทั้งหมดนี้คืออะไร? var arr = ["one", "two", "three"]; if (jQuery.inArray("one", arr) > -1) { alert("Found"); } การปรับโครงสร้างifคำสั่ง: if (!!~jQuery.inArray("one", arr)) { alert("Found"); } ทำให้พังถล่ม: jQuery.inArray("one", arr) // 0 ~jQuery.inArray("one", arr) // -1 (why?) !~jQuery.inArray("one", arr) // false !!~jQuery.inArray("one", arr) // true -2ฉันยังพบว่าถ้าฉันใส่ตัวหนอนในหน้าผลที่ได้คือ …

1
ลำดับความสำคัญและการดำเนินการ bitmask
ฉันเจอเคสที่แปลกมาก (ดูเหมือน) ใช้หมายเลข 2 ( 0b10) และ bitmask ด้วย 1 ( 0b01) สิ่งนี้ควรสร้าง0b00ซึ่งเทียบเท่ากับ 0 อย่างไรก็ตามนี่คือสิ่งที่ Mr Schrödingerเข้ามา: var_dump(0b10 & 0b01); // int(0) var_dump(0b10 & 0b01 == 0); // int(0) var_dump(0b10 & 0b01 != 0); // int(0) เหล้าวิสกี้. แทงโก้. ฟ็อกซ์ทรอต ฉันยอมรับว่าไม่ใช่คนที่คมที่สุดเมื่อพูดถึงตัวดำเนินการระดับบิต - ดังนั้นฉันอาจจะผิดพลาดอย่างน่ากลัวตรงไหน อย่างไรก็ตามใน Python: 0b10 & 0b01 == 0 = …

5
ผลการดำเนินงานระดับบิตในขนาดตัวแปรที่ไม่คาดคิด
บริบท เรากำลังพอร์ตโค้ด C ที่คอมไพล์แล้วโดยใช้คอมไพเลอร์ C แบบ 8 บิตสำหรับไมโครคอนโทรลเลอร์ PIC สำนวนทั่วไปที่ใช้เพื่อป้องกันตัวแปรโกลบอลที่ไม่ได้ลงชื่อ (ตัวอย่างเช่นตัวนับข้อผิดพลาด) จากการย้อนกลับเป็นศูนย์มีดังต่อไปนี้: if(~counter) counter++; ผู้ประกอบการระดับบิตที่นี่กลับค่าบิตทั้งหมดและคำสั่งเป็นจริงหากcounterน้อยกว่าค่าสูงสุด ที่สำคัญทำงานได้โดยไม่คำนึงถึงขนาดของตัวแปร ปัญหา ตอนนี้เรากำลังกำหนดเป้าหมายหน่วยประมวลผล ARM แบบ 32 บิตโดยใช้ GCC เราสังเกตเห็นว่ารหัสเดียวกันให้ผลลัพธ์ที่แตกต่าง เท่าที่เราสามารถบอกได้ดูเหมือนว่าการทำงานส่วนเสริม bitwise คืนค่าที่มีขนาดแตกต่างจากที่เราคาดไว้ ในการทำซ้ำสิ่งนี้เรารวบรวมใน GCC: uint8_t i = 0; int sz; sz = sizeof(i); printf("Size of variable: %d\n", sz); // Size of variable: 1 sz = …

5
เปรียบเทียบบิตกับบูลีน
ว่าฉันมีชุดของค่าสถานะการเข้ารหัสใน flagsuint16_t ตัวอย่างเช่นAMAZING_FLAG = 0x02. ตอนนี้ฉันมีฟังก์ชั่น ฟังก์ชั่นนี้ต้องตรวจสอบว่าฉันต้องการเปลี่ยนธงหรือไม่เพราะถ้าฉันต้องการทำเช่นนั้นฉันต้องเขียนเป็นแฟลช และนั่นก็มีราคาแพง ดังนั้นฉันต้องการการตรวจสอบซึ่งจะบอกฉันถ้ามีค่าเท่ากับflags & AMAZING_FLAG doSetนี่เป็นความคิดแรก: setAmazingFlag(bool doSet) { if ((flags & AMAZING_FLAG) != (doSet ? AMAZING_FLAG : 0)) { // Really expensive thing // Update flags } } นี่ไม่ใช่คำสั่งที่ใช้งานง่าย ฉันรู้สึกว่าควรจะมีวิธีที่ดีกว่าบางอย่างเช่น: if ((flags & AMAZING_FLAG) != doSet){ } แต่ตอนนี้ไม่ได้ทำงานจริงน่าจะเท่ากับtrue0x01 ดังนั้นมีวิธีที่เป็นระเบียบในการเปรียบเทียบบิตกับบูลีนหรือไม่?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.