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

การดำเนินการแบบดั้งเดิมระดับต่ำที่จัดการกับรูปแบบบิตและเลขฐานสองโดยตรง

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

2
ทำไมผู้ประกอบการระดับบิตมีลำดับความสำคัญต่ำกว่าการเปรียบเทียบ?
ใครบางคนสามารถอธิบายเหตุผลได้ทำไมในภาษายอดนิยม (ดูหมายเหตุด้านล่าง) ตัวดำเนินการเปรียบเทียบ (==,! =, <,>, <=,> =) มีลำดับความสำคัญสูงกว่าตัวดำเนินการระดับบิต (&, |, ^ , ~)? ฉันไม่คิดว่าฉันเคยเจอการใช้งานที่สำคัญกว่านี้จะเป็นธรรมชาติ มันเป็นสิ่งที่ชอบเสมอ: if( (x & MASK) == CORRECT ) ... // Chosen bits are in correct setting, rest unimportant if( (x ^ x_prev) == SET ) // only, and exactly SET bit changed if( (x & …

7
การใช้ขอบเขตที่กำหนดสำหรับบิตแฟล็กใน C ++
enum X : int(C #) หรือenum class X : int(C ++ 11) เป็นชนิดที่มีเขตข้อมูลภายในที่ซ่อนของintที่สามารถเก็บค่าใด ๆ นอกจากนี้ค่าคงที่จำนวนหนึ่งที่กำหนดไว้ล่วงหน้าของXจะถูกกำหนดไว้ใน enum เป็นไปได้ที่จะส่งค่า enum ให้เป็นค่าจำนวนเต็มและในทางกลับกัน ทั้งหมดนี้เป็นจริงทั้งใน C # และ C ++ 11 ใน C # enums ไม่ได้ใช้เพียงเพื่อเก็บค่าของแต่ละบุคคล แต่ยังถืออยู่รวมกันค่าที่เหมาะสมของธงตามคำแนะนำของไมโครซอฟท์ เช่น enums (ปกติ แต่ไม่จำเป็น) ตกแต่งด้วย[Flags]แอตทริบิวต์ เพื่อทำให้ชีวิตของนักพัฒนาง่ายขึ้นผู้ประกอบการระดับบิต (OR, และอื่น ๆ ... ) จะได้รับการโหลดมากเกินไปเพื่อให้คุณสามารถทำสิ่งนี้ได้อย่างง่ายดาย (C #): void M(NumericType flags); M(NumericType.Sign …

13
โปรแกรมเมอร์ที่มีความรอบรู้ดีแค่ไหนที่จะต้องมีการดำเนินการที่ชาญฉลาด? [ปิด]
ฉันได้รับการเรียกดูรหัส OpenJDK บางเมื่อเร็ว ๆ นี้และได้พบบางอย่างที่น่าสนใจชิ้นส่วนของรหัสมีที่จะทำอย่างไรกับการดำเนินงานบิตที่ชาญฉลาด ฉันยังถามคำถามเกี่ยวกับ StackOverflow อีกตัวอย่างที่แสดงให้เห็นถึงจุด: 1141 public static int bitCount(int i) { 1142 // HD, Figure 5-2 1143 i = i - ((i >>> 1) & 0x55555555); 1144 i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); 1145 i = (i + (i >>> 4)) …

1
ทำไมเครื่องหมายรูปหมวกใช้สำหรับ XOR แทนการยกกำลัง?
ไม่ว่ามันจะเป็นปัญหาสำหรับทุกคนที่เคยประสบปัญหาเกี่ยวกับวากยสัมพันธ์นี้มาก่อน แต่ฉันเห็นความสับสนจำนวนมากที่เกิดขึ้นจากการใช้คาเร็ต ( ^) เนื่องจากการทำงานของ XOR แทนการปฏิบัติการยกกำลังทางคณิตศาสตร์ที่ยอมรับกันอย่างกว้างขวาง แน่นอนว่ามีหลายแห่งที่อธิบายและแก้ไขการใช้คาเร็ต (mis-) แต่ฉันไม่ได้เจอแหล่งข้อมูลที่ชัดเจนว่าทำไมคาเร็ตได้รับความหมายที่แตกต่างกัน มันเป็นเรื่องของความสะดวกสบายหรือไม่? อุบัติเหติ? เห็นได้ชัดว่าการใช้เหตุผลอาจแตกต่างกันไปในแต่ละภาษาดังนั้นข้อมูลใด ๆ ก็ตามจะมีความเฉียบแหลม

11
เมื่อฉันทดสอบความแตกต่างในเวลาระหว่างการเลื่อนและการคูณใน C ไม่มีความแตกต่าง ทำไม?
ฉันได้รับการสอนแล้วว่าการขยับเป็นเลขฐานสองนั้นมีประสิทธิภาพมากกว่าการคูณด้วย 2 ^ k ดังนั้นฉันต้องการทดสอบและฉันใช้รหัสต่อไปนี้เพื่อทดสอบ: #include <time.h> #include <stdio.h> int main() { clock_t launch = clock(); int test = 0x01; int runs; //simple loop that oscillates between int 1 and int 2 for (runs = 0; runs < 100000000; runs++) { // I first compiled + ran it a few …

15
ผู้ประกอบการบิตมีประโยชน์อย่างไร? [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ภาษาการเขียนโปรแกรมมักจะมาพร้อมกับตัวดำเนินการบิตต่าง ๆ (เช่นการเปลี่ยนบิตซ้าย - ขวาและบิต, ค่าบิตและ AND, หรือ, แฮคเกอร์ ... ) สิ่งเหล่านี้ไม่ได้ถูกใช้อย่างมาก แต่อย่างน้อยประสบการณ์ของฉันก็เช่นกัน บางครั้งพวกเขาจะใช้ในการเขียนโปรแกรมความท้าทายหรือคำถามสัมภาษณ์หรือวิธีแก้ปัญหาต้องใช้พวกเขาเช่น: โดยไม่ต้องใช้ตัวดำเนินการเท่าเทียมกันใด ๆ สร้างฟังก์ชันที่ส่งคืนtrueเมื่อสองค่าเท่ากัน โดยไม่ใช้ตัวแปรตัวที่สามให้สลับค่าของตัวแปรสองตัว สิ่งเหล่านี้อีกครั้งอาจมีการใช้งานจริงไม่กี่แห่ง ฉันเดาว่าพวกเขาควรจะเร็วขึ้นเพราะพวกเขาจัดการหน่วยความจำโดยตรงในระดับต่ำ เหตุใดจึงพบเช่นนี้ในภาษาการเขียนโปรแกรมส่วนใหญ่ กรณีใช้งานจริงใด ๆ

6
ข้อดีของการใช้การดำเนินการระดับบิตคืออะไร [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ต่อไปนี้การอ่านจดหมายข่าวล่าสุด CodeProject ฉันมาข้ามบทความนี้ในการดำเนินงานค่าที่เหมาะสม มันทำให้การอ่านน่าสนใจและแน่นอนฉันสามารถเห็นประโยชน์ของการตรวจสอบว่าจำนวนเต็มเป็นเลขคู่หรือคี่ แต่ทดสอบว่าบิต n-th ถูกตั้งค่าหรือไม่ อะไรคือข้อดีของสิ่งนี้

2
มีข้อได้เปรียบในการจัดการบิตของ c-style มากกว่า std :: bitset หรือไม่?
ฉันทำงานเฉพาะใน C ++ 11/14 และมักจะประจบประแจงเมื่อฉันเห็นรหัสเช่นนี้ std::int64_t mArray; mArray |= someMask << 1; นี่เป็นเพียงตัวอย่างเท่านั้น ฉันกำลังพูดถึงการจัดการบิตที่ชาญฉลาดโดยทั่วไป ใน C ++ มีจุดใดจริง ๆ หรือไม่ ข้างต้นคือการแปรปรวนของจิตใจและข้อผิดพลาดได้ง่ายในขณะที่ใช้std::bitsetช่วยให้คุณ: ปรับเปลี่ยนขนาดของstd::bitsetสิ่งที่ต้องการได้ง่ายขึ้นโดยการปรับพารามิเตอร์เทมเพลตและให้การใช้งานสามารถจัดการส่วนที่เหลือและ ใช้เวลาน้อยลงในการหาว่าเกิดอะไรขึ้น (และอาจทำผิดพลาด) และเขียนstd::bitsetในลักษณะที่คล้ายกับstd::arrayหรือบรรจุข้อมูลอื่น ๆ คำถามของฉันคือ; มีเหตุผลที่จะไม่ใช้std::bitsetกับประเภทดั้งเดิมอื่น ๆ นอกเหนือจากความเข้ากันได้ย้อนหลัง?

4
เทคนิค bit-wise ที่คุณชื่นชอบคืออะไร? [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการอภิปรายโต้แย้งโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา ล็อคแล้ว คำถามและคำตอบของคำถามนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ ไม่กี่วันที่ผ่านมาสมาชิกของ StackExchange Anto ได้สอบถามเกี่ยวกับการใช้งานที่ถูกต้องสำหรับตัวดำเนินการบิตที่ชาญฉลาด ฉันระบุว่าการขยับเร็วกว่าการคูณและหารจำนวนเต็มด้วยพลังของสอง Daemin สมาชิก StackExchange โต้กลับโดยระบุว่าการเปลี่ยนทางขวานำเสนอปัญหาด้วยจำนวนลบ ณ จุดนี้ฉันไม่เคยคิดที่จะใช้ตัวดำเนินการ shift กับจำนวนเต็มที่ลงนามแล้ว ฉันใช้เทคนิคนี้เป็นหลักในการพัฒนาซอฟต์แวร์ระดับต่ำ ดังนั้นฉันมักจะใช้จำนวนเต็มไม่ได้ลงนาม C ดำเนินการทางตรรกะกับจำนวนเต็มที่ไม่ได้ลงนาม ไม่มีการจ่ายความสนใจให้กับบิตลงชื่อเมื่อดำเนินการเลื่อนตรรกะอย่างถูกต้อง บิตที่ว่างจะถูกเติมด้วยค่าศูนย์ อย่างไรก็ตาม C ดำเนินการกะการคำนวณทางคณิตศาสตร์เมื่อเลื่อนจำนวนเต็มทางขวาที่ลงนาม บิตที่ว่างจะถูกเติมด้วยบิตเครื่องหมาย ความแตกต่างนี้ทำให้ค่าลบถูกปัดเศษเป็นอนันต์แทนที่จะถูกปัดเศษเป็นศูนย์ซึ่งเป็นพฤติกรรมที่แตกต่างจากการหารจำนวนเต็มที่ลงนามแล้ว ความคิดเพียงไม่กี่นาทีส่งผลให้เกิดโซลูชั่นอันดับหนึ่ง วิธีการแก้ปัญหาแปลงค่าลบให้เป็นค่าบวกก่อนที่จะขยับ ค่าจะถูกแปลงแบบมีเงื่อนไขกลับสู่รูปแบบลบหลังจากดำเนินการกะแล้ว int a = -5; int n = 1; int negative = …

3
จัดเก็บค่าลบที่เซ็นชื่ออย่างไร
ฉันกำลังดูวิดีโอนี้เกี่ยวกับค่าสูงสุดและต่ำสุดของจำนวนเต็มที่ลงนามแล้ว นำตัวอย่างของค่าที่มีเครื่องหมายบวก - 0000 0001 บิตแรกแสดงว่าจำนวนเป็นค่าบวกและ 7 บิตสุดท้ายเป็นตัวเลขเอง ดังนั้นจึงตีความได้ง่ายว่า +1 ทีนี้ลองดูตัวอย่างค่าลบที่มีเครื่องหมาย - 1,000 0000 ซึ่งออกมาเป็น -8 โอเคคอมพิวเตอร์สามารถเข้าใจได้ว่ามันเป็นค่าลบเพราะบิตแรก แต่มันเข้าใจได้อย่างไรว่า 000 0000 หมายถึง -8? โดยทั่วไปแล้วค่าจัดเก็บข้อมูลเชิงลบที่เก็บ / ตีความในคอมพิวเตอร์เป็นอย่างไร

3
ค่า“ (int) & ค่า 0x1, (int) & ค่า 0x2, (int) ค่า & 0x4, (int) ค่า & 0x8” หมายถึงอะไร "
"value" มีค่าตั้งแต่ 0 ถึง 15 (ค่าที่เป็นไปได้) เมื่อใดที่จะเป็นไปตามเงื่อนไข 4 "ถ้า" ถ้าค่า (int) ของฉัน = 2 นี่หมายความว่า 0010 หรือไม่ if ((int)value & 0x1) { //statement here } if ((int)value & 0x2) { //statement here } if ((int)value & 0x4) { //statement here } if ((int)value & 0x8) { //statement here }

3
มีบางสิ่งที่พิเศษเกี่ยวกับหมายเลข 65535 หรือไม่?
2¹⁶-1 & 2⁵ = 2⁵ (หรือ? ชัด?) ผู้พัฒนาถามฉันในวันนี้ 65535 & 32 bitwise คือ2¹⁶-1 & 2⁵ =? ตอนแรกฉันคิดว่าเป็นไปตามธรรมชาติ 32 แต่ดูเหมือนง่ายที่ฉันคิดว่าเป็นเวลาหลายนาทีแล้วตอบ 32. 32 ดูเหมือนจะเป็นคำตอบที่ถูกต้อง แต่อย่างไร 65535 = 2¹⁶-1 = 1111111111111111 (แต่มันดูไม่ถูกต้องเพราะเลขฐานสองนี้ทั้งหมดควรเป็น -1 (?)), 32 = 100,000 แต่ฉันไม่สามารถแปลงมันในหัวของฉันดังนั้นฉันตอบ 32 แล้วตั้งแต่ฉัน เพื่อตอบคำถาม คำตอบที่ 32 เป็นเรื่องจริงเล็กน้อย เป็นเช่นเดียวกัน 2 same-1 & 2 &-1 = 31 หรือไม่ …

2
เป็นไปได้ไหมที่จะกำหนดโอเปอเรเตอร์ bitwise ทั้งหมดโดยใช้ 'bitwise nand' คล้ายกับวิธีบูลลอจิกทั้งหมดที่สามารถสร้างโดยใช้เพียง 'บูลีน nand'?
Nand เป็นที่รู้จักในฐานะประตูตรรกะสากลเพราะมันช่วยให้คุณกำหนดประตูตรรกะแบบบูลอื่น ๆ ทั้งหมด: not(x) = nand(x,x) and(x, y) = not(nand(x, y)) or(x, y) = nand(not(x), not(y)) nor(x, y) = not(or(x, y)) xor(x, y) = nand(nand(a, nand(a, b)), nand(b, nand(a, b))) สิ่งนี้เรียกว่าnand-logicและมักใช้ในคอมพิวเตอร์สมัยใหม่เพราะทรานซิสเตอร์สามารถทำตัวเหมือน nand-gate ฉันสงสัยว่ามันเป็นไปได้ที่จะทำสิ่งที่คล้ายกับการดำเนินงานระดับบิต Can เช่นบิต NAND (bnand) ถูกนำมาใช้ในการกำหนดbnot, bor, band, bnor, bxor? มีการดำเนินการระดับบิตสากล?

3
ความเร็วของการคูณ << >> และการหาร
คุณสามารถใช้&lt;&lt;เพื่อคูณและ&gt;&gt;หารตัวเลขในไพ ธ อนเมื่อฉันเวลาพวกเขาพบว่าการใช้วิธีการเปลี่ยนแบบไบนารีในการทำนั้นเร็วกว่าการหารหรือคูณด้วยวิธีปกติเป็น 10 เท่า ทำไมถึงใช้งาน&lt;&lt;และ&gt;&gt;เร็วกว่า*และมาก/? เบื้องหลังกระบวนการอะไรที่เกิดขึ้น*และ/ช้าลง?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.