คำถามติดแท็ก bit-manipulation

การจัดการของแต่ละบิต ตัวดำเนินการที่ใช้อาจประกอบด้วยค่าบิตและ AND, OR, XOR, NOT, กะซ้ายและขวากะ

12
อธิบายการใช้บิตเวกเตอร์เพื่อพิจารณาว่าตัวละครทุกตัวมีลักษณะเฉพาะหรือไม่
ฉันสับสนเกี่ยวกับการทำงานของเวกเตอร์บิต (ไม่คุ้นเคยกับบิตเวกเตอร์) นี่คือรหัสที่ได้รับ ใครช่วยกรุณาพาฉันไปที่นี้ public static boolean isUniqueChars(String str) { int checker = 0; for (int i = 0; i < str.length(); ++i) { int val = str.charAt(i) - 'a'; if ((checker & (1 << val)) > 0) return false; checker |= (1 << val); } return true; } โดยเฉพาะสิ่งที่checkerทำคืออะไร?


10
ความคิดที่อยู่เบื้องหลัง ^ = 32 คืออะไรที่แปลงตัวอักษรตัวพิมพ์เล็กเป็นตัวพิมพ์ใหญ่และในทางกลับกัน?
ฉันกำลังแก้ไขปัญหาบางอย่างใน codeforces โดยปกติฉันตรวจสอบก่อนว่าอักขระเป็นตัวอักษรภาษาอังกฤษตัวบนหรือล่างจากนั้นลบหรือเพิ่ม32เพื่อแปลงเป็นตัวอักษรที่เกี่ยวข้อง แต่ฉันพบว่ามีคนทำ^= 32เพื่อทำสิ่งเดียวกัน นี่มันคือ: char foo = 'a'; foo ^= 32; char bar = 'A'; bar ^= 32; cout << foo << ' ' << bar << '\n'; // foo is A, and bar is a ฉันค้นหาคำอธิบายสำหรับเรื่องนี้แล้วและไม่พบคำตอบ เหตุใดจึงใช้งานได้

9
ทำไม XOR ถึงเป็นวิธีเริ่มต้นในการรวมแฮช
สมมติว่าคุณมีสอง hashes H(A)และH(B)และคุณต้องการที่จะรวมพวกเขา ผมเคยอ่านว่าเป็นวิธีที่ดีที่จะรวมทั้งสอง hashes คือการให้พวกเขาเช่นXORXOR( H(A), H(B) ) คำอธิบายที่ดีที่สุดที่ฉันพบถูกสัมผัสสั้น ๆ ที่นี่ในแนวทางฟังก์ชั่นแฮช : แฮคเกอร์ตัวเลขสองตัวที่มีการแจกแจงแบบสุ่มอย่างคร่าวๆส่งผลให้ตัวเลขอีกตัวยังคงมีการกระจายแบบสุ่ม * แต่ตอนนี้ขึ้นอยู่กับค่าสองค่า ... * ที่แต่ละบิตของสองตัวเลขที่จะรวมกัน 0 จะถูกส่งออกถ้าทั้งสองบิตมีค่าเท่ากันหรือ 1 ในคำอื่น ๆ 50% ของชุดค่าผสมจะมีการส่งออก 1 ดังนั้นถ้าบิตอินพุตสองตัวแต่ละตัวมีโอกาสประมาณ 50-50 ที่จะเป็น 0 หรือ 1 ดังนั้นบิตเอาต์พุตก็เช่นกัน คุณสามารถอธิบายสัญชาตญาณและ / หรือคณิตศาสตร์ได้ไหมว่าทำไมแฮคเกอร์ถึงควรเป็นปฏิบัติการเริ่มต้นสำหรับการรวมฟังก์ชั่นแฮช (แทนที่จะเป็น OR หรือ AND เป็นต้น)

8
'และ' (boolean) vs '&' (bitwise) - ทำไมความแตกต่างของพฤติกรรมกับรายการเทียบกับ numpy arrays?
อะไรอธิบายความแตกต่างในพฤติกรรมของการดำเนินการบูลีนและระดับบิตในรายการเทียบกับ NumPy อาร์เรย์? ฉันสับสนเกี่ยวกับการใช้&vs andใน Python ที่เหมาะสมแสดงในตัวอย่างต่อไปนี้ mylist1 = [True, True, True, False, True] mylist2 = [False, True, False, True, False] >>> len(mylist1) == len(mylist2) True # ---- Example 1 ---- >>> mylist1 and mylist2 [False, True, False, True, False] # I would have expected [False, True, False, False, False] …


3
ทำไมค่าสุ่มนี้จึงมีการแจกแจง 25/75 แทนที่จะเป็น 50/50
แก้ไข:ดังนั้นโดยทั่วไปสิ่งที่ฉันพยายามที่จะเขียนเป็นกัญชา 1 doubleบิตสำหรับ ฉันต้องการที่จะแมปdoubleไปtrueหรือfalseมีโอกาสที่ 50/50 สำหรับที่ฉันเขียนโค้ดที่เลือกตัวเลขสุ่ม(เช่นเป็นตัวอย่างฉันต้องการใช้กับข้อมูลที่มี regularities และยังได้ผลลัพธ์ 50/50)ตรวจสอบบิตสุดท้ายและส่วนเพิ่มyหากเป็น 1 หรือnถ้าเป็น 0 แต่รหัสนี้อย่างต่อเนื่องส่งผลให้ใน 25% yและ n75% ทำไมมันไม่ 50/50 และทำไมการกระจายแบบแปลก ๆ แต่ตรงไปตรงมา (1/3) public class DoubleToBoolean { @Test public void test() { int y = 0; int n = 0; Random r = new Random(); for (int i = 0; i …

15
ฉันควรใช้ #define, enum หรือ const?
ในโปรเจ็กต์ C ++ ที่ฉันกำลังทำอยู่ฉันมีค่าแฟล็กซึ่งสามารถมีได้สี่ค่า ธงทั้งสี่นี้สามารถรวมกันได้ แฟล็กอธิบายถึงเร็กคอร์ดในฐานข้อมูลและสามารถ: สถิติใหม่ ลบบันทึก แก้ไขบันทึก บันทึกที่มีอยู่ ตอนนี้สำหรับแต่ละระเบียนฉันต้องการเก็บแอตทริบิวต์นี้ไว้ดังนั้นฉันจึงสามารถใช้ enum: enum { xNew, xDeleted, xModified, xExisting } อย่างไรก็ตามในที่อื่น ๆ ในโค้ดฉันจำเป็นต้องเลือกว่าจะให้ผู้ใช้มองเห็นเรกคอร์ดใดได้บ้างดังนั้นฉันจึงต้องการส่งผ่านข้อมูลนั้นเป็นพารามิเตอร์เดียวเช่น: showRecords(xNew | xDeleted); ดูเหมือนว่าฉันจะมี appoaches ที่เป็นไปได้สามอย่าง: #define X_NEW 0x01 #define X_DELETED 0x02 #define X_MODIFIED 0x04 #define X_EXISTING 0x08 หรือ typedef enum { xNew = 1, xDeleted, xModified = …

22
ตำแหน่งของบิตที่มีนัยสำคัญน้อยที่สุดที่ตั้งค่าไว้
ฉันกำลังมองหาวิธีที่มีประสิทธิภาพในการกำหนดตำแหน่งของบิตที่มีนัยสำคัญน้อยที่สุดที่กำหนดเป็นจำนวนเต็มเช่นสำหรับ 0x0FF0 ซึ่งจะเป็น 4 การใช้งานที่ไม่สำคัญคือ: unsigned GetLowestBitPos(unsigned value) { assert(value != 0); // handled separately unsigned pos = 0; while (!(value & 1)) { value >>= 1; ++pos; } return pos; } มีความคิดอย่างไรที่จะบีบบางรอบออกจากมัน? (หมายเหตุ: คำถามนี้มีไว้สำหรับคนที่ชอบสิ่งนั้นไม่ใช่สำหรับคนที่บอกว่า xyzoptimization นั้นชั่วร้าย) [แก้ไข] ขอบคุณทุกคนสำหรับแนวคิด! ฉันได้เรียนรู้สิ่งอื่น ๆ ด้วยเช่นกัน เย็น!

27
วิธีใดที่เร็วที่สุด / มีประสิทธิภาพที่สุดในการค้นหาบิตชุดสูงสุด (msb) ในจำนวนเต็มใน C
ถ้าฉันมีจำนวนเต็ม n และฉันต้องการทราบตำแหน่งของบิตที่มีนัยสำคัญที่สุด (นั่นคือถ้าบิตที่มีนัยสำคัญน้อยที่สุดอยู่ทางขวาฉันต้องการทราบตำแหน่งของบิตทางซ้ายที่ไกลที่สุดซึ่งเป็น 1) วิธีใดที่เร็วที่สุด / มีประสิทธิภาพที่สุดในการค้นหา ฉันรู้ว่า POSIX สนับสนุนffs()วิธีการใน strings.h เพื่อค้นหาบิตชุดแรก แต่ดูเหมือนจะไม่มีfls()วิธีที่เกี่ยวข้อง มีวิธีที่ชัดเจนในการทำสิ่งนี้ที่ฉันพลาดไปหรือไม่? แล้วในกรณีที่คุณไม่สามารถใช้ฟังก์ชัน POSIX เพื่อการพกพาได้ล่ะ? แก้ไข: สิ่งที่เกี่ยวกับโซลูชันที่ใช้ได้กับสถาปัตยกรรมทั้ง 32 และ 64 บิต (รายการรหัสหลายรายการดูเหมือนว่าจะใช้ได้เฉพาะกับ 32 บิตเท่านั้น)

6
ฉันจะเขียน bit-mask ที่บำรุงรักษาได้รวดเร็วและคอมไพล์ไทม์ใน C ++ ได้อย่างไร
ฉันมีรหัสที่มากกว่าหรือน้อยกว่านี้: #include <bitset> enum Flags { A = 1, B = 2, C = 3, D = 5, E = 8, F = 13, G = 21, H, I, J, K, L, M, N, O }; void apply_known_mask(std::bitset<64> &bits) { const Flags important_bits[] = { B, D, E, H, K, …

30
ใน C / C ++ วิธีที่ง่ายที่สุดในการย้อนกลับลำดับของบิตเป็นไบต์คืออะไร?
แม้ว่าจะมีหลายวิธีในการย้อนกลับลำดับบิตในแต่ละไบต์ แต่ฉันก็อยากรู้ว่าอะไร "ง่ายที่สุด" สำหรับนักพัฒนาในการนำไปใช้ และโดยการย้อนกลับฉันหมายถึง: 1110 -> 0111 0010 -> 0100 คำถามนี้คล้ายกับ แต่ไม่ซ้ำกับคำถาม PHP นี้ คำถามนี้คล้ายกับ แต่ไม่ซ้ำกับคำถาม C นี้ คำถามนี้กำลังถามหาวิธีที่ง่ายที่สุดในการนำไปใช้โดยนักพัฒนา "อัลกอริทึมที่ดีที่สุด" เกี่ยวข้องกับหน่วยความจำและประสิทธิภาพของซีพียู
110 c++  c  bit-manipulation 

16
การทำงานและการใช้งาน Bitwise
พิจารณารหัสนี้: x = 1 # 0001 x << 2 # Shift left 2 bits: 0100 # Result: 4 x | 2 # Bitwise OR: 0011 # Result: 3 x & 1 # Bitwise AND: 0001 # Result: 1 ฉันสามารถเข้าใจตัวดำเนินการทางคณิตศาสตร์ใน Python (และภาษาอื่น ๆ ) ได้ แต่ฉันไม่เคยเข้าใจตัวดำเนินการ 'bitwise' ค่อนข้างดี ในตัวอย่างด้านบน (จากหนังสือ Python) …

20
C / C ++ ตรวจสอบว่ามีการตั้งค่าหนึ่งบิตหรือไม่เช่นตัวแปร int
int temp = 0x5E; // in binary 0b1011110. มีวิธีตรวจสอบว่าบิต 3 ใน temp เป็น 1 หรือ 0 โดยไม่ต้องขยับและกำบังเล็กน้อยหรือไม่ แค่อยากรู้ว่ามีฟังก์ชันในตัวสำหรับสิ่งนี้หรือฉันถูกบังคับให้เขียนด้วยตัวเอง
102 c++  c  bit-manipulation 

8
ฉันจะรับข้อมูลบิตต่อบิตจากค่าจำนวนเต็มใน C ได้อย่างไร
ฉันต้องการแยกบิตของตัวเลขทศนิยม ตัวอย่างเช่น 7 คือไบนารี 0111 และฉันต้องการรับ 0 1 1 1 บิตทั้งหมดที่เก็บไว้ในบูล ฉันจะทำเช่นนั้นได้อย่างไร? ตกลงการวนซ้ำไม่ใช่ตัวเลือกที่ดีฉันจะทำอย่างอื่นได้ไหม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.