วันอังคารที่ 27 พฤษภาคม พ.ศ. 2557

Arduino : การเข้าถึงข้อมูลระดับบิตด้วย struct union

Standard
      พอดีมีโอกาสได้เขียน Arduino (รวมถึงภาษา C โดยทั่วไป) แล้วจะต้องจัดการข้อมูลในระดับบิต ซึ่งปกติก็ใช้การ shift bit แล้ว AND กับ 1 เพื่อดูว่าบิตในตำแหน่งที่สนใจเป็นค่าอะไร
(data >> BIT_INDEX) & 1 == ?

    จาก code ตัวอย่างข้อบนตัวแปร data แล้ว shift ไป BIT_INDEX ตัว จากนั้นนำข้อมูลที่ได้มา AND กับ 1 เพื่อให้ bit ที่ 7-1 (กำหนดให้นับ 8 ตัวคือ index ที่ 0 - 7) มีค่าเป็น 0  เช่น
0xA5 แล้วอยากดูว่า บิตที่ตำแหน่งที่ 3 มีค่าเป็นอะไร ตำแหน่งที่ 3 ต้อง shift ไปทางขวา 2 บิต 1010 0101 >> 2  = 0010 1001 จากนั้น AND ด้วย 1 เพื่อให้ค่าในตำแหน่งอื่นมีค่าเป็น 0 กรณีที่ต้องการนำค่าไปใส่ในตัวแปร 0010 1001 & 1 = 1 
     วิธีดังกล่าวข้างต้นเป็นวิธีที่มีการใช้กันโดยทั่วไป แต่ผมจะมาเสนออีกวิธีในการเข้าถึงข้อมูลแบบบิตด้วยการใช้ structure และ union ในภาษาซี

จาก struct ข้างต้นเป็นการ union ของ data structure 2 ตัวด้วยกันคือ struct { bit_7...bit_0 }  และ uint8_t byte_0 ซึ่งสามารถเข้าถึงข้อมูลด้วย . หรือ -> ถ้าเป็น pointer เหมือน struct ทั่วไป

ตารางเทียบข้อมูลใน Memory

source code ทดสอบว่าเราคิดถูก :)


ผลการรันโปรแกรม








0 ความคิดเห็น:

แสดงความคิดเห็น