วันพฤหัสบดีที่ 30 พฤศจิกายน พ.ศ. 2560

Arduino ตอนที่ 7 ตัวดำเนินการ (Operator)

ไม่มีความคิดเห็น

Arduino ตอนที่ 7 ตัวดำเนินการ (Operator)


ตัวดำเนินการ คือ สัญลักษณ์ที่ใช้การการกระทำกับข้อมูลนั้นๆ เช่น การบวกข้อมูล การเปรียบเทียบ และการเปลี่ยนแปลงข้อมูล โดยเรื่องการดำเนินการนี้จะเป็นส่วนต่อของเรื่องตัวแปรนั้นเอง

ตัวดำเนินการด้านการคำนวน

ตัวดำเนินการด้านการคำนวน คือการใช้สัญลักษณ์ต่างๆ มาใช้ในการคำนวนทางคณิตศาสตร์พื้นฐาน ได้แก่ การบวก ลบ คูณ หาร ตัวดำเนินการด้านการคำนวนใน Arduino มีดังนี้
สัญลักษณ์การดำเนินการ
+บวกเลข
-ลบเลข
*คูณเลข
/หารเลข
%หารเอาเศษ
++เพิ่มค่าขึ้นหนึ่ง
--ลดค่าลงหนึ่ง
ตัวอย่าง 1
int number;
number = 10 + 20;
จากโค้ดในตัวอย่างที่ 1 ได้มีการสร้างตัวแปร number ชนิด int แบบไม่กำหนดค่า ในบรรทัดต่อมาได้มีการใช้ตัวดำเนินการบวกเลข 10 กับ 20 แล้วจึงนำไปเก็บในตัวแปร number ดังนั้นสุดท้ายแล้ว number จึงมีค่าเป็น 30
ตัวอย่าง 2
int number = 10;
boolean is_even;
is_even = number%2;
ตัวอย่างที่ 2 นี้เป็นโปรแกรมตรวจเช็คว่าเป็นเลขคู่หรือเลขคี่ ในบรรทัดแรก ได้ประกาศตัวแปรชนิด int ชื่อ number เพื่อเก็บตัวเลขที่ใช้เช็ค ในบรรทัดที่ 2 ประกาศตัวแปรชนิด boolean ชื่อตัวแปร is_even ใช้เก็บค่าว่าเป็นเลขคู่ หรือเลขคี่ โดยจะสามารถใส่ค่าเป็น 0 (False : เท็จ) หรือ 1 (True : จริง) ในบรรทัดที่ 3 ใช้สัญลักษณ์ % กับ 2 หมายถึงการนำค่าในตัวแปร number มาหารด้วย 2 เอาเฉพาะเศษ ในตัวอย่างตัวแปร number มีค่าเป็น 10 เมื่อนำมาหารด้วย 2 แล้วเอาเฉพาะเศษ ซึ่ง 10 หารด้วย 2 ไม่มีเศษ จึงได้ค่าเป็น 0 ไปเก็บในตัวแปร is_even

ตัวดำเนินการเปรียบเทียบ

ตัวดำเนินการเปรียบเทียบ คือการนำตัวเลข 2 จำนวนมาเปรียบเทียบกัน
สัญลักษณ์การดำเนินการ
==เท่ากับ
!=ไม่เท่ากับ
>มากกว่า
<น้อยกว่า
>=มากกว่า หรือเท่ากับ
<=น้อยกว่า หรือเท่ากับ
ตัวอย่าง
10 == 50 ผลลัพธ์ เท็จ
10 < 50 ผลลัพธ์ จริง
10 <= 10 ผลลัพธ์ จริง
10 < 10 ผลลัพธ์ เท็จ
80 != 10 ผลลัพธ์ จริง
'A' == 'a' ผลลัพธ์ เท็จ
'C' == 'C' ผลลัพธ์ จริง
* สาเหตุที่สามารถเปรียบเทียบตัวอักษรได้ เนื่องจากคอมไพเลอร์จะแปลงตัวอักษรเป็นรหัสแอสกี (ASCII)

ตัวดำเนินการทางตรรก (Logical Operator)

ตัวดำเนินการด้านตรรกใช้ในการดำเนินการเปรียบเทียบซ้อน
สัญลักษณ์การดำเนินการ
||หรือ (มีการเปรียบเทียบใดเป็นจริง หรือเป็นจริงทั้งหมด ผลที่ได้คือจริง)
&&และ (เป็นจริงทั้งหมด ผลที่ได้จึงจะเป็นจริง)
!กลับค่า
ตัวอย่าง
10 == 50 || 20 == 20 ผลลัพธ์ จริง
10 == 50 && 20 == 20 ผลลัพธ์ เท็จ
'A' != 'A' && 'A' == 'A' ผลลัพธ์ เท็จ
100 < 200 && 300 < 400 && 500 <= 500 ผลลัพธ์ จริง

ตัวดำเนินการระดับบิต (Bitwise Operators)

เป็นการดำเนินการกับบิตในเลขฐาน 2 เช่น การเลื่อนบิต การเซ็ตบิต โดยตัวดำเนินการการนี้จะใช้ได้กับข้อมูลชนิด char int และ byte เท่านั้น
สัญลักษณ์การดำเนินการ
&
And
|OR
^Exclusive OR (XOR)
~กลับค่าบิต (1's complement)
>>เลื่อนบิตไปทางขวา
<<เลื่อนบิตไปทางซ้าย
* โดยปกติแล้ว Arduino จะไม่ต้องใช้การดำเนินการระดับบิต เพราะการดำเนินการระดับบิตจะใช้กับการเซ็ตรีจิสเตอร์เป็นส่วนใหญ่ ซึ่ง Arduino ใช้ไลบารี่ในการเซ็ตรีจิสเตอร์ ทำให้ไม่จำเป็นต้องเซ็ตรีจิสเตอร์เอง
ตัวอย่าง
byte a = 0x0000001;
a = a|0x00000010; // ผลคือ a ได้ 00000011 เพราะ 0000001 OR 00000010 ได้ 00000011
a = a&0x00000000; // ผลคือ a ได้ 00000000 เนื่องจาก 00000011 AND 00000000 ได้ 00000000
a = 0x00110000; // เซ็ตตัวแปร a เป็น 00110000
a = ~a; // ผลคือ a ได้ 11001111 เพราะนำค่า 00110000 มา 1' complement
a = a<<2; ผลคือ a ได้ 00111100 เพราะเลื่อนไปทางซ้าย 2 ตัว ทำให้บิตที่เกินถูกตัดออก และเพิ่ม 0 มาทางซ้าย 2 ตัว
a = a>>2; ผลคือ a ได้ 00001111 เพราะเลื่อนไปทางขวา 2 ตัว ทำให้มี 0 เพิ่มขึ้นมาทางขวา 2 ตัว ส่วนค่าที่เกินอยู่ด้านซ้ายก็ถูกตัดออก

การเซ็ตบิต

a |= (1<<2); // เซ็ตบิตที่ 2 ให้เป็น 1 ด้วยการสร้าง 00000001 ขึ้นมา แล้วเลื่อนบิตไปทางซ้าย 2 ตัว ทำให้มี 0 เพิมขึ้นมา เป็น 00000100 แล้วนำไป OR กับ a ดังนั้นไม่ว่า a บิตที่ 2 จะเป็นอะไร เมื่อนำมา OR ผลที่ได้คือบิตที่ 2 จะเป็น 1

การเคลียร์บิต

a &= ~(1<<2); // เซ็ตบิตที่ 2 ให้เป็น 1 ด้วยการสร้าง 00000001 ขึ้นมา แล้วเลื่อนบิตไปทางซ้าย 2 ตัว ทำให้มี 0 เพิมขึ้นมา เป็น 00000100 แล้วกลับค่า จึงได้เป็น 0x11111011 แล้วนำไป AND กับ a ดังนั้นไม่ว่า a บิตที่ 2 จะเป็นอะไร เมื่อนำมา AND ผลที่ได้คือบิตที่ 2 จะเป็น 0

ตัวดำเนินการแบบสั้น (Compound Assignment)

จากในตารางตัวดำเนินการด้านการคำนวน จะเห็นว่ามีตัวดำเนินการ ++ ในการเพิ่มค่า และตัวดำเนินการ -- ในการลบค่า เราสามารถนำมาใช้ได้ดังนี้
int loop_num = 0;
void setup() { }
void loop() {
  delay(1000);
  loop_num++;
}
จากโค้ด จะเห็นว่ามีการประกาศตัวแปร loop_num ไว้ด้านบนสุด เพื่อนับจำนวนรอบในการวนลูป ในฟังก์ชั่นหลัก loop() ได้ใช้ฟังก์ชั่น delay() เพื่อหน่วงเวลาหลังจากหมดเวลาหน่วงเวลา ได้ใช้ตัวดำเนินการ ++ ในการเพิ่มค่าให้กับตัวแปร loop_num ขึ้นหนึ่งลำดับ และวนรอบเพิ่มค่าไปเรื่อยๆไม่สิ้นสุด
int loop_num = 0;
void setup() { }
void loop() {
  delay(1000);
  loop_num += 10;
}
จากโค้ดด้านบน บรรทัดที่ 5 ได้เปลี่ยนตัวดำเนินการจาก ++ เป็น += เพื่อใช้เพิ่มค่าหลายจำนวน ซึ่งจะมีค่าเท่ากับ loop_num + 10 แต่วิธีนี้สั้นกว่า จึงนิยมใช้มากกว่าในการทำงานแค่เพิ่มค่าหมายจำนวน ซึ่งจะใช้กับลบ คูณ หาร ก็ได้เช่นกัน โดยเปลี่ยนจาก += เป็น -= *= /=
นอกจากการใช้ ++ วนการบวกค่าแล้ว ยังสามารถที่จะดึงค่าก่อนบวก หรือหลังบวก พร้อมกับการบวกจำนวนเพิ่มขึ้นไปได้อีกด้วย โดยการนำ ++ ไปวางไว้หน้าตัวแปร เพื่อให้ส่งค่ากลับก่อนบวก หรือนำ ++ ไปไว้หลังตัวแปร เพื่อให้บวกก่อนส่งค่ากลับ เช่น
int loop_num = 0, last;
void setup() { }
void loop() {
  delay(1000);
  last = ++loop_num;
}
การจัดการกับข้อมูลระดับบิต ก็สามารถจะยุบรูปแบบได้เช่นกัน
ตัวดำเนินการตัวอย่างมีค่าเท่ากับ
<<=a<<=b;a = a<<b;
&=a &= b;a = a&b;
|=a |= b;a = a|b;
^=a ^= b;a = a ^ b;

ไม่มีความคิดเห็น :

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