【雕爷学编程】Arduino 手册之位操作 bit()
什么是Arduino?
Arduino 是一款开源的电子原型平台,它可以让你用简单的硬件和软件来创建各种创意的项目。无论你是初学者还是专家,Arduino 都能为你提供无限的可能性。你可以用 Arduino 来控制传感器、灯光、马达、机器人、物联网设备等等,只要你能想到的,Arduino 都能帮你实现。
如果你想了解更多关于 Arduino 的信息,你可以访问 Arduino 的官方网站,那里有丰富的资源和教程供你参考。你也可以加入 Arduino 的社区,和来自世界各地的爱好者、学生、设计师和工程师交流心得和经验。此外,你还可以使用 Arduino 的在线编程工具,在云端编写代码并上传到你的开发板上。
Arduino 是一个不断发展和创新的平台,它有着广泛的应用领域和潜力。这里希望本手册能激发你对 Arduino 的兴趣和热情,让你享受 Arduino 带来的创造力和乐趣。
维基百科的定义
Arduino 是一个开源嵌入式硬件平台,用来供用户制作可交互式的嵌入式项目。此外 Arduino 作为一个开源硬件和开源软件的公司,同时兼有项目和用户社群。该公司负责设计和制造Arduino电路板及相关附件。这些产品按照GNU宽通用公共许可证(LGPL)或GNU通用公共许可证(GPL)许可的开源硬件和软件分发的,Arduino 允许任何人制造 Arduino 板和软件分发。 Arduino 板可以以预装的形式商业销售,也可以作为 DIY 套件购买。
Arduino 2005 年时面世,作为意大利伊夫雷亚地区伊夫雷亚互动设计研究所的学生设计,目的是为新手和专业人员提供一种低成本且简单的方法,以建立使用传感器与环境相互作用的装置。初学者和爱好者可用Arduino制造传感器、简单机器人、恒温器和运动检测器等装置。
Arduino 这个名字来自意大利伊夫雷亚的一家酒吧,该项目的一些创始人过去常常会去这家酒吧。 酒吧以伊夫雷亚的 Arduin(Arduin of Ivrea)命名,他是伊夫雷亚边疆伯爵,也是 1002 年至 1014 年期间的意大利国王。
十九、Arduino 位操作 bit()
Arduino的bit()是一个函数,用于返回一个数值,该数值只有指定位置的二进制位为1,其他位都为0。这个函数可以用于处理多位的数据,比如byte、int、long等,或者进行位运算。
bit()的适用范围:
1)用于创建一个掩码,用于与其他数值进行位与或位或运算,以设置或清除某些位的状态。例如,如果要设置一个byte类型的变量的最高位为1,可以用bit(7)创建一个掩码,然后与原变量进行位或运算。
2)用于检测一个数值的某一位的状态,用于与其他数值进行位与运算,以判断该位是否为1。例如,如果要检测一个byte类型的变量的最高位是否为1,可以用bit(7)创建一个掩码,然后与原变量进行位与运算,如果结果不为0,则说明该位为1。
3)用于将多个单独的位组合成一个数值,用于与其他数值进行位或运算,以生成一个新的数值。例如,如果要将一个byte类型的变量的第0、2、4、6位都设置为1,可以用bit(0)、bit(2)、bit(4)、bit(6)创建四个掩码,然后依次与原变量进行位或运算。
主要应用场景:
1)读取传感器数据:在许多应用中,传感器的输出通常是一个字节或整数,其中的特定位表示特定的传感器数据。使用bit()函数可以方便地读取特定位的值,从而获取传感器的具体数据。
2)判断标志位:在某些情况下,使用位来表示特定的标志位,例如开关状态、使能标志、错误标志等。bit()函数可以将字节或整数中特定位的值提取出来,以便进行相应的判断或处理。
3)位操作中的辅助操作:bit()函数常常被用作位操作中的辅助函数,与其他位操作函数结合使用,以实现更复杂的位操作逻辑。
bit()的使用注意事项有以下几点:
bit()只能作用于一个常量,不能作用于一个变量或表达式。例如,bit(x)是错误的写法,应该先将x赋值给一个常量,然后再用bit()提取。
bit()返回的是一个无符号长整型(unsigned long)的值,范围是0~4294967295。如果要将其转换为其他类型,需要进行强制类型转换。例如,如果要将其转换为byte类型,需要写成byte(bit(n))。
bit()只能提取0~31位置的二进制位的值。如果要提取其他位置的位的值,需要使用其他方法。例如,如果要提取第32位的值,可以先右移31位,然后再用bit(0)提取。
以下是Arduino的bit()几个实际运用程序案例:
例1:创建一个掩码
//定义一个byte类型的变量
byte x = 0b10101010;
//创建一个掩码
byte mask = bit(7); //10000000
//设置最高位为1
x = x | mask; //10101010 | 10000000 = 11101010
//打印修改后的结果
Serial.begin(9600);
Serial.println(x, BIN);
这个程序的输出是:
11101010
这是因为0b10101010与掩码0b10000000进行位或运算后得到0b11101010。
例2:检测一个数值的某一位的状态
//定义一个byte类型的变量
byte x = 0b10101010;
//创建一个掩码
byte mask = bit(7); //10000000
//检测最高位是否为1
if (x & mask != 0) { //10101010 & 10000000 = 10000000
Serial.println("The highest bit is 1");
} else {
Serial.println("The highest bit is 0");
}
//打印检测结果
Serial.begin(9600);
这个程序的输出是:
The highest bit is 1
这是因为0b10101010与掩码0b10000000进行位与运算后得到0b10000000,不等于0。
例3:将多个单独的位组合成一个数值
//定义一个byte类型的变量
byte x = 0;
//创建四个掩码
byte mask1 = bit(0); //00000001
byte mask2 = bit(2); //00000100
byte mask3 = bit(4); //00010000
byte mask4 = bit(6); //01000000
//将第0、2、4、6位都设置为1
x = x | mask1; //00000000 | 00000001 = 00000001
x = x | mask2; //00000001 | 00000100 = 00000101
x = x | mask3; //00000101 | 00010000 = 00010101
x = x | mask4; //00010101 | 01000000 = 01010101
//打印组合后的结果
Serial.begin(9600);
Serial.println(x, BIN);
这个程序的输出是:
01010101
这是因为0与四个掩码依次进行位或运算后得到0b01010101。
:
例4:读取传感器数据
void setup() {
byte sensorData = 0b10101010; // 假设有一个字节表示传感器数据
// 读取特定的传感器数据
bool sensorValue = bitRead(sensorData, 2); // 读取第3位的值
// 根据传感器数据进行相应的处理
if (sensorValue) {
// 执行某些操作
} else {
// 执行其他操作
}
// 进行其他操作
// ...
}
void loop() {
// 执行其他操作
// ...
}
例5:判断标志位
void setup() {
byte status = 0xFF; // 假设有一个字节表示设备状态
// 判断特定的标志位
bool flag = bitRead(status, 1); // 判断第2位的值
// 根据标志位进行相应的处理
if (flag) {
// 执行某些操作
} else {
// 执行其他操作
}
// 进行其他操作
// ...
}
void loop() {
// 执行其他操作
// ...
}
例6:位操作中的辅助操作
void setup() {
byte data = 0b10101010; // 假设有一个字节数据
// 在位操作中使用bit()函数辅助操作
bool bitValue = bitRead(data, 3); // 读取第4位的值
// 根据读取的位值进行其他位操作
byte mask = 0b00110011; // 假设有一个掩码
if (bitValue) {
// 与掩码进行位与运算
byte result = data & mask;
// 执行某些操作
} else {
// 执行其他操作
}
// 进行其他操作
// ...
}
void loop() {
// 执行其他操作
// ...
}
:例7:获取字节中特定位的值
byte value = 0b10101010; // 字节变量
int bitPosition = 2; // 位位置
byte bitValue = bit(value, bitPosition); // 获取位位置2的值
// 使用获取到的位值进行处理
// ...
例8:获取整数变量的特定位的值
int value = 0b11001100; // 整数变量
int bitPosition = 5; // 位位置
int bitValue = bit(value, bitPosition); // 获取位位置5的值
// 使用获取到的位值进行处理
// ...
例9:获取字节变量中多个位的值
byte value = 0b11001111; // 字节变量
int bitValue1 = bit(value, 1); // 获取位位置1的值
int bitValue2 = bit(value, 3); // 获取位位置3的值
int bitValue3 = bit(value, 7); // 获取位位置7的值
// 使用获取到的位值进行处理
// ...
这些案例展示了bit()函数在不同应用中的应用场景。通过使用bit()函数,可以方便地获取字节或整数中特定位的值,用于读取传感器数据、判断标志位或作为位操作的辅助操作。请根据具体的应用需求,选择适当的位操作函数来实现所需的功能。