คืออยากทราบความหมายและการนำไปใช้ครับ ช่วยยกตัวอย่างทีนะครับ ขอบคุณครับ
3 posters
ช่วยอธิบายความหมายของ BITAND BITNOT BITOR
scanditionx- PSsix Member Class III
จำนวนข้อความ : 51
ความนิยม : 0
เข้าร่วมเมื่อ : 02/10/2010
อายุ : 35
ที่อยู่ : ดาวโลก
POS- PSsix
-
จำนวนข้อความ : 1152
ความนิยม : 326
เข้าร่วมเมื่อ : 19/07/2010
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 ได้ลึกขึ้นกว่าเดิม ลองดูตัวอย่าง
อีกแบบให้ผลเหมือนกัน แต่ใช้คำสั่งที่สั้นกว่า (อาจงงกว่าด้วยถ้าไม่เข้าใจ)
หลักความจริงก็คือ คำสั่งใน 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 ก็แค่การสลับตำแหน่ง จะมองว่าเป็นการใช้สวิชปิดกับเปิดก็ได้ (แต่ไม่ค่อยได้ใช้สักเท่าไหร่)
จบ
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- PSsix Member Super Class III
-
จำนวนข้อความ : 268
ความนิยม : 54
เข้าร่วมเมื่อ : 31/03/2011
อายุ : 26
ว้าวๆ..ความรู้ๆ ต้องรีบเก็บ..
ขอบคุณครับท่าน Admin
ขอบคุณครับท่าน Admin
scanditionx- PSsix Member Class III
จำนวนข้อความ : 51
ความนิยม : 0
เข้าร่วมเมื่อ : 02/10/2010
อายุ : 35
ที่อยู่ : ดาวโลก
ขอบคุณครับ ที่ช่วยแนะนำความรู้ดีๆให้ครับ
|
|