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

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

bit()

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

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

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

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

void setup()
{
  pinMode(13, OUTPUT);
}

void loop()
{
    int bits = bit(2);
    for (int i = 0; i  < bits; i++) {
        digitalWrite(13, HIGH);
        delay(100);

        digitalWrite(13, LOW);
        delay(100);
    }

    delay(1000);
}

bitClear()

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

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  int x = 15;
  int n = 0;
  int res = bitClear(x, n);
  Serial.print(res, BIN); // print the output of bitClear(x,n)
  Serial.println("\n--------------");

  n = 1;
  res = bitClear(x, n);
  Serial.print(res, BIN); // print the output of bitClear(x,n)
  Serial.println("\n--------------");

  n = 2;
  res = bitClear(x, n);
  Serial.print(res, BIN); // print the output of bitClear(x,n)
  Serial.println("\n--------------");

  n = 3;
  res = bitClear(x, n);
  Serial.print(res, BIN); // print the output of bitClear(x,n)
  Serial.println("\n--------------");
}

void loop() {
}

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

在这里插入图片描述

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

bitRead()

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

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  int x = 13;
  int n = 0;
 
  for (int i = 0; i < 4; i++) {
    Serial.print(i);
    Serial.print(" --> ");

    int res = bitRead(x, i);
    Serial.print(res); // print the output of bitClear(x,n)
    Serial.println("\n--------------");
  }
}

void loop() {
}

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

bitSet()

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

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  int x = 13;
  int n = 0;
 
   bitSet(x, 1);
   Serial.print(x, BIN);
}

void loop() {
}

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

bitWrite()

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

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

void loop() {}

highByte()

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

lowByte()

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

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

void setup() {
  Serial.begin(9600);
  while (!Serial) {}  // wait for serial port to connect. Needed for native USB port only

  int x = 0b1110110011110000;  // the 0b prefix indicates a binary constant
  Serial.println(x, BIN);

  // high byte (from left)
  byte res = highByte(x);
  Serial.println(res, BIN);

  // low byte (from right)
  res = lowByte(x);
  Serial.println(res, BIN);
}

void loop() {}

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值