Ariduino入门笔记——7. Arduino 默认函数(比特操作)

雨点打透心脏的1/2处 2023-01-19 04:36 127阅读 0赞

比特位操作,是编程中常用的一种技巧。Arduino也提供了这方面的API,以方便开发者使用。

文章目录

  • bit()
  • bitClear()
  • bitRead()
  • bitSet()
  • bitWrite()
  • highByte()
  • lowByte()

bit()

从描述上很难搞清楚这个函数有什么用,干什么的。这样解释一下,这是算比特位的。
举例来说:

bit(1) = binary(10) = 2
bit(2) = binary(100) = 4
bit(3) = binary(1000) = 8

至于如何验证,你可以试一试执行以下程序看一看,如果你使用的是UNO板,那么一般默认UNO板上的#13引脚是板载LED灯。

另外,这个示例程序,最好的演示效果是,1秒闪8次。也就是bit(3)。

  1. void setup()
  2. {
  3. pinMode(13, OUTPUT);
  4. }
  5. void loop()
  6. {
  7. int bits = bit(2);
  8. for (int i = 0; i < bits; i++) {
  9. digitalWrite(13, HIGH);
  10. delay(100);
  11. digitalWrite(13, LOW);
  12. delay(100);
  13. }
  14. delay(1000);
  15. }

bitClear()

同样,从官方的解释来看也是摸不着头脑。那不如我们直接写个程序跑跑看效果。

  1. void setup() {
  2. Serial.begin(9600);
  3. while (!Serial) {
  4. ; // wait for serial port to connect. Needed for native USB port only
  5. }
  6. int x = 15;
  7. int n = 0;
  8. int res = bitClear(x, n);
  9. Serial.print(res, BIN); // print the output of bitClear(x,n)
  10. Serial.println("\n--------------");
  11. n = 1;
  12. res = bitClear(x, n);
  13. Serial.print(res, BIN); // print the output of bitClear(x,n)
  14. Serial.println("\n--------------");
  15. n = 2;
  16. res = bitClear(x, n);
  17. Serial.print(res, BIN); // print the output of bitClear(x,n)
  18. Serial.println("\n--------------");
  19. n = 3;
  20. res = bitClear(x, n);
  21. Serial.print(res, BIN); // print the output of bitClear(x,n)
  22. Serial.println("\n--------------");
  23. }
  24. void loop() {
  25. }

官方说,这个函数负责给数位上写零,那么我们就要具体看看是怎么写零的。为了更好观察输出结果,我们提前使用到了串口指令。还不清楚什么叫串口的童鞋,没关系,你只需要记着编译完程序后,立即到Arduino IDE右上方点击这个标志,打开一个新的窗口。

在这里插入图片描述

然后不出意外,应该能得到这样一个输出
在这里插入图片描述
我把数据以2进制形式打印出来,所以可以更清晰易懂这个函数的使用方法。

bitRead()

官方说法,是从数据中读取对应位置的比特值,那么具体怎么执行的,还是上代码比较直观。

  1. void setup() {
  2. Serial.begin(9600);
  3. while (!Serial) {
  4. ; // wait for serial port to connect. Needed for native USB port only
  5. }
  6. int x = 13;
  7. int n = 0;
  8. for (int i = 0; i < 4; i++) {
  9. Serial.print(i);
  10. Serial.print(" --> ");
  11. int res = bitRead(x, i);
  12. Serial.print(res); // print the output of bitClear(x,n)
  13. Serial.println("\n--------------");
  14. }
  15. }
  16. void loop() {
  17. }

在这里插入图片描述
要知道,13的二进制值是 1101,所以你应该知道这个函数是怎么回事了。

bitSet()

这个函数是把对应位置的比特值设置为1,因此对于13(1101)来说,如果我们让1位的比特值变成1,那么这个值就会变成15.

  1. void setup() {
  2. Serial.begin(9600);
  3. while (!Serial) {
  4. ; // wait for serial port to connect. Needed for native USB port only
  5. }
  6. int x = 13;
  7. int n = 0;
  8. bitSet(x, 1);
  9. Serial.print(x, BIN);
  10. }
  11. void loop() {
  12. }

在这里插入图片描述
记住,这个函数不返回任何值,所以修改就会直接修改到原值。

bitWrite()

这是一个写比特的函数,功能和 bitSet 很像,也一样不返回任何结果,直接对原数据进行修改。不过需要注意一点的是, bitSet是把指定的位写为1,而这个函数可以自定。

  1. void setup() {
  2. Serial.begin(9600);
  3. while (!Serial) { } // wait for serial port to connect. Needed for native USB port only
  4. byte x = 0b10000000; // the 0b prefix indicates a binary constant
  5. Serial.println(x, BIN); // 10000000
  6. bitWrite(x, 0, 1); // write 1 to the least significant bit of x
  7. Serial.println(x, BIN); // 10000001
  8. }
  9. void loop() { }

highByte()

从左往右取高位字节,我个人不推荐使用

lowByte()

从右往左取低位字节,我个人不推荐使用。

我们这里直接上一段代码,这样可以更明白这两个函数是怎么使用的。

  1. void setup() {
  2. Serial.begin(9600);
  3. while (!Serial) { } // wait for serial port to connect. Needed for native USB port only
  4. int x = 0b1110110011110000; // the 0b prefix indicates a binary constant
  5. Serial.println(x, BIN);
  6. // high byte (from left)
  7. byte res = highByte(x);
  8. Serial.println(res, BIN);
  9. // low byte (from right)
  10. res = lowByte(x);
  11. Serial.println(res, BIN);
  12. }
  13. void loop() { }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,127人围观)

还没有评论,来说两句吧...

相关阅读