ฟอรั่ม PSsix

Would you like to react to this message? Create an account in a few clicks or log in to continue.

ฟอรั่มของบล็อก http://pssix.blogspot.com


3 posters

    ช่วยอธิบายความหมายของ BITAND BITNOT BITOR

    scanditionx
    scanditionx
    PSsix Member Class III
    PSsix Member Class III


    PSsix Game Coder
    จำนวนข้อความ : 51
    ความนิยม : 0
    เข้าร่วมเมื่อ : 02/10/2010
    อายุ : 35
    ที่อยู่ : ดาวโลก

    ช่วยอธิบายความหมายของ BITAND BITNOT BITOR Empty ช่วยอธิบายความหมายของ BITAND BITNOT BITOR

    ตั้งหัวข้อ by scanditionx 22/07/11, 11:02 pm

    คืออยากทราบความหมายและการนำไปใช้ครับ ช่วยยกตัวอย่างทีนะครับ ขอบคุณครับ
    POS
    POS
    PSsix
    PSsix


    ช่วยอธิบายความหมายของ BITAND BITNOT BITOR Empty ช่วยอธิบายความหมายของ BITAND BITNOT BITOR Empty ช่วยอธิบายความหมายของ BITAND BITNOT BITOR Empty
    จำนวนข้อความ : 1152
    ความนิยม : 326
    เข้าร่วมเมื่อ : 19/07/2010

    ช่วยอธิบายความหมายของ BITAND BITNOT BITOR Empty Re: ช่วยอธิบายความหมายของ BITAND BITNOT BITOR

    ตั้งหัวข้อ by POS 23/07/11, 10:34 am

    BitAND นำเอาข้อมูลสองอย่างมาแปลงเป็นข้อมูลระดับบิต แล้วนำเอาตัวเลขบิตในแต่ละหน่วยมาเปรียบเทียบกัน จำง่ายๆ ก็คือ ถ้า 1 กับ 1 ได้ 1 , ถ้ามี 0 ร่วมอยู่จะได้ค่าเป็น 0
    0110
    0100
    ได้ผลลัพธ์
    0100

    BitOR เหมือน BitAND คือนำตัวเลขบิตในแต่ละหน่วยมาเปรียบเทียบกัน แต่วิธีการเปรียบเทียบจะต่างกันคือ ถ้าตัวเลขบิต 0 กับ 0ได้ 0 , ถ้ามี 1 ร่วมอยู่ด้วยจะให้ค่าเป็น 1
    0110
    0100
    ได้ผลลัพธ์
    0110

    BitNOT กลับค่าบิตจาก 0 เป็น 1 และ 1 เป็น 0 เช่น
    1001
    กลับแล้วได้
    0110

    ประโยชน์จริงๆ ก็คือช่วยในการคำนวณครับ ถ้าทำเป็นแล้วรู้จักนำมาใช้จะผลลัพธ์ที่เร็วกว่า การบวกลบคูณหารตามปกติ(ช่วยลดการประมวลผล CPU ด้วย)

    ประโยชน์ทางอ้อมทำให้เข้าใจการเขียนสคริปต์ AutoIt ได้ลึกขึ้นกว่าเดิม ลองดูตัวอย่าง

    Code:
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
     
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("PSsix Full Screen", 281, 178, 192, 124, BitOR($WS_SYSMENU,$WS_MAXIMIZE,$WS_POPUP))
    $Button1 = GUICtrlCreateButton("Exit", 192, 16, 75, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    While 1
       $nMsg = GUIGetMsg()
       Switch $nMsg
          Case $GUI_EVENT_CLOSE
             Exit
          Case $Button1
             exit
       EndSwitch
    WEnd


    อีกแบบให้ผลเหมือนกัน แต่ใช้คำสั่งที่สั้นกว่า (อาจงงกว่าด้วยถ้าไม่เข้าใจ)

    Code:
    #include <GUIConstantsEx.au3>

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("PSsix Full Screen", 281, 178, 192, 124, 0x81080000)
    $Button1 = GUICtrlCreateButton("Exit", 192, 16, 75, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    While 1
       $nMsg = GUIGetMsg()
       Switch $nMsg
          Case $GUI_EVENT_CLOSE
             Exit
          Case $Button1
             exit
       EndSwitch
    WEnd

    หลักความจริงก็คือ คำสั่งใน AutoIt นั้นผูกติดอยู่กับวินโดวส์ และการคำนวณทางคณิตศาสตร์
    ตัวตำแหน่งสถานะของคำสั่ง GUICreate เมื่อแปลงเป็นตัวเลขแล้วจะได้ดังนี้ (ตัวเลขพวกนี้ต้นตอจริงๆ ไม่ได้มาจากผู้ผลิต AutoIt แต่มาจากไมโครซอฟท์)

    $WS_SYSMENU = 0x00080000
    $WS_MAXIMIZE = 0x01000000
    $WS_POPUP = 0x80000000

    นำตัวเลขทั้งสามมา BitOR ก็จะได้ 0x81080000

    ถ้ามองดีๆ จะเห็นว่าแค่ยุบรวม เข้าใจอย่างนั้นผิดครึ่งหนึ่งครับ (แต่ถ้าเข้าใจว่า BitOR คือการยุบรวมแล้วคุณผิดเต็มๆ)

    การBitOR จะทุบตัวเลขทั้งหมดให้แตกละเอียดจนถึงระดับบิต แล้วนำเอาแต่หน่วยบิตมาเปรียบเทียบกัน
    ซึ่งตัวเลขด้านบนนี้ความจงใจของโปรแกรมเมอร์ไมโครซอฟท์ ที่จะเว้นว่างตัวเลขแต่ละตำแหน่งเอาไว้ไม่ให้ซ้อนกัน เพื่อไม่ให้มีผลการเปลี่ยนตัวเลขในแต่ละลำดับ

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


    ทีนี้ลองมาดูคำสั่ง BitAND ตัวอย่างการใช้แบบง่าย

    If BitAND(GUICtrlRead($Checkbox1), $GUI_CHECKED) Then
    endif

    คำสั่งด้านบนที่เห็นเป็นชุดคำสั่ง แท้จริงก็แค่สมการทางคณิตศาสตร์เท่านั้น ผมจะแยกวิธีคิดคำสั่งหลัง if แปลงมาเป็นตัวเลขให้ดูนะครับ

    GUICtrlRead($Checkbox1) = 1 (ค่าที่ได้จากการอ่านคอนโทรลหากมีการเช็คจะได้ค่าเป็น 1 )
    $GUI_CHECKED =1 (ค่าคงที่ $GUI_CHECKED มีค่าเป็น 1)

    BitAND เปรียบเทียบ 1 กับ 1 จะได้ 1

    1 เป็นตัวเลขทางตรรกมีค่าเท่ากับ จริง ดังนั้นผลก็คือ หากเช็กบ็อกซ์ $Checkbox1 มีการคลิกถูก เงื่อนไขก็จะเป็นจริง และทำคำสั่งที่อยู่ถัดจาก then


    ส่วน BitNOT ก็แค่การสลับตำแหน่ง จะมองว่าเป็นการใช้สวิชปิดกับเปิดก็ได้ (แต่ไม่ค่อยได้ใช้สักเท่าไหร่)

    จบ
    Arm
    Arm
    PSsix Member Super Class III
    PSsix Member Super Class III


    PSsix Master PSsix Program Coder
    จำนวนข้อความ : 268
    ความนิยม : 54
    เข้าร่วมเมื่อ : 31/03/2011
    อายุ : 26

    ช่วยอธิบายความหมายของ BITAND BITNOT BITOR Empty Re: ช่วยอธิบายความหมายของ BITAND BITNOT BITOR

    ตั้งหัวข้อ by Arm 23/07/11, 01:11 pm

    ว้าวๆ..ความรู้ๆ ต้องรีบเก็บ..
    ขอบคุณครับท่าน Admin
    scanditionx
    scanditionx
    PSsix Member Class III
    PSsix Member Class III


    PSsix Game Coder
    จำนวนข้อความ : 51
    ความนิยม : 0
    เข้าร่วมเมื่อ : 02/10/2010
    อายุ : 35
    ที่อยู่ : ดาวโลก

    ช่วยอธิบายความหมายของ BITAND BITNOT BITOR Empty Re: ช่วยอธิบายความหมายของ BITAND BITNOT BITOR

    ตั้งหัวข้อ by scanditionx 24/07/11, 11:43 am

    ขอบคุณครับ ที่ช่วยแนะนำความรู้ดีๆให้ครับ

      เวลาขณะนี้ 02/05/24, 08:57 am