【雕爷学编程】Arduino 手册之位运算 | (位或)

在这里插入图片描述
在这里插入图片描述
什么是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 系列电路板的设计大多使用 Atmel AVR 单片机。这些电路板配有一组数字和模拟I/O引脚,可以连接各种扩展板或面包板(Shields 扩展版)和其他电路。这些电路板具有串行端口,包括某些型号上的通用串行总线(USB),也用于从个人电脑加载程序。

软件编程方面,通常使用C/C++程序语言,官方提供了一个Arduino IDE用开发。除了使用传统的编译工具链之外,Arduino 项目还提供了一个基于 Processing 语言项目的集成开发环境。另外,一些少儿编程教育软件提供了对 Arduino 的可视化编程。

在这里插入图片描述

八、Arduino位运算
是一种用于对二进制数进行逻辑或算术操作的运算。它可以用于处理数字信号、控制位域、优化性能等场景。Arduino位运算包括以下几种类型:

按位与(&):该运算符用于将两个整数的每一位进行逻辑与操作,即如果两个位都为1,结果为1,否则为0。例如,92 & 101 = 68,因为0000000001011100 & 0000000001100101 = 00000000010001001。
按位或(|):该运算符用于将两个整数的每一位进行逻辑或操作,即如果两个位中有一个为1,结果为1,否则为0。例如,92 | 101 = 125,因为0000000001011100 | 0000000001100101 = 00000000011111012。
按位异或(^):该运算符用于将两个整数的每一位进行逻辑异或操作,即如果两个位不同,结果为1,否则为0。例如,12 ^ 10 = 6,因为0000000000001100 ^ 0000000000001010 = 00000000000001102。
按位非():该运算符用于对一个整数的每一位进行逻辑非操作,即将0变为1,将1变为0。例如,103 = -104,因为~0000000001100111 = 11111111100110001。
左移(<<):该运算符用于将一个整数的所有位向左移动指定的位数,左边溢出的位被丢弃,右边空出的位用0填充。例如,10 << 2 = 40,因为00000000001010 << 2 = 000001010003。
右移(>>):该运算符用于将一个整数的所有位向右移动指定的位数,右边溢出的位被丢弃,左边空出的位根据符号位填充。如果是正数,则用0填充;如果是负数,则用1填充。例如,10 >> 2 = 2,因为00001010 >> 2 = 103。

Arduino位运算的注意事项主要有以下几点:
Arduino中的int型是16位的,所以在进行位运算时要注意不要超出范围或造成数据丢失。
Arduino中的char型是8位的,并且是有符号的。所以在使用char型变量进行位运算时要注意符号扩展的问题。
Arduino中没有提供无符号右移运算符>>>,所以在对无符号整数进行右移时要注意不要引入错误的高位。
Arduino中没有提供循环移位运算符<<<和>>>,所以在需要循环移动某些位时要自己实现。

2、| (位或)
Arduino位运算 | (位或)是一种用于将两个整数的每一位进行逻辑或操作的运算符,即如果两个位中有一个为1,结果为1,否则为0。例如,92 | 101 = 125,因为0000000001011100 | 0000000001100101 = 0000000001111101。

位或运算的应用场景主要有以下几种:
1)当我们需要将一个整数的某一位设置为1时,我们可以使用位或运算来实现。例如,如果我们想将一个整数n的第4位(从右往左数)设置为我们可以将n与一个只有第4位为1的数(即00001000)进行位或运算,结果就是将n的第4位置1。例如:

//定义一个整数n
int n = 7; //二进制表示为00000111

//定义一个只有第4位为1的数
int mask = 8; //二进制表示为00001000

//使用位或运算将n的第4位设置为1
n = n | mask; //结果为15,二进制表示为00001111

2)当我们需要使用掩码(mask)来合并一个整数中的某些特定位时,我们可以使用位或运算来实现。例如,如果我们想合并一个字节中的高四位和低四位,我们可以分别使用两个掩码,一个只有高四位有效(如11110000),一个只有低四位有效(如00001111),然后分别与原字节进行位或运算,得到合并后的字节。例如:

//定义一个字节b
byte b = 170; //二进制表示为10101010

//定义两个掩码
byte high_mask = 240; //二进制表示为11110000
byte low_mask = 15; //二进制表示为00001111

//使用位或运算合并b中的高四位和低四位
byte result = (b & high_mask) | (b & low_mask); //结果为170,二进制表示为10101010

3)当我们需要使用多个标志(flag)来表示不同的状态时,我们可以使用位或运算来实现。例如,如果我们想用一个字节来表示LED灯的颜色和亮度,我们可以定义四个标志,分别表示红色、绿色、蓝色和高亮度。然后根据需要将这些标志进行位或运算,得到不同的组合。例如:

//定义四个标志
#define RED 1 //二进制表示为00000001
#define GREEN 2 //二进制表示为00000010
#define BLUE 4 //二进制表示为00000100
#define BRIGHT 8 //二进制表示为00001000

//使用位或运算得到不同的颜色和亮度组合
byte yellow = RED | GREEN; //结果为3,二进制表示为00000011
byte magenta = RED | BLUE; //结果为5,二进制表示为00000101
byte cyan = GREEN | BLUE; //结果为6,二进制表示为00000110
byte white = RED | GREEN | BLUE; //结果为7,二进制表示为00000111
byte bright_red = RED | BRIGHT; //结果为9,二进制表示为00001001
byte bright_green = GREEN | BRIGHT; //结果为10,二进制表示为00001010
byte bright_blue = BLUE | BRIGHT; //结果为12,二进制表示为00001100
byte bright_white = RED | GREEN | BLUE | BRIGHT; //结果为15,二进制表示为00001111

位或运算的注意事项主要有以下几点:
1)位或运算只能用于整型数据,不能用于浮点型或字符串型数据。
2)位或运算的优先级低于算术运算符(如+,-,*,/),所以在混合使用时要注意加括号。
3)位或运算的结果取决于操作数的长度和符号。如果操作数长度不同,则会自动进行类型转换;如果操作数有符号,则会考虑符号扩展。

当在Arduino(C++)中使用位运算符|(位或)时,它通常用于执行位级别的逻辑操作。下面是三个实际运用程序案例,展示了|运算符的使用:

1)设置特定位(Setting specific bits):

void setup() {
  unsigned int value = 0b00110000;  // 二进制表示的值

  unsigned int mask = 0b00001111;  // 用于设置低位的掩码

  unsigned int result = value | mask;

  cout << "Result: " << bitset<8>(result) << endl;
}

在上述示例中,我们有一个无符号整数value,其二进制表示为00110000。我们定义了一个掩码mask,其二进制表示为00001111,用于设置低位。通过将valuemask进行位或操作(|),我们可以将value中指定位置上的位设置为1。

2)合并位字段(Merging bit fields):

void setup() {
  unsigned int field1 = 0b11000000;  // 字段1
  unsigned int field2 = 0b00001100;  // 字段2
  unsigned int field3 = 0b00000011;  // 字段3

  unsigned int merged = field1 | field2 | field3;

  cout << "Merged: " << bitset<8>(merged) << endl;
}

在这个示例中,我们有三个位字段field1field2field3,它们分别代表不同的位。通过使用位或操作(|),我们可以将这些位字段合并到一个变量中,形成一个更大的位字段。

3)权限控制(Permission control):

const unsigned int ReadPermission = 0b00000001;
const unsigned int WritePermission = 0b00000010;
const unsigned int ExecutePermission = 0b00000100;

void checkPermission(unsigned int permission) {
  if (permission & ReadPermission) {
    cout << "Read permission granted." << endl;
  }

  if (permission & WritePermission) {
    cout << "Write permission granted." << endl;
  }

  if (permission & ExecutePermission) {
    cout << "Execute permission granted." << endl;
  }
}

void setup() {
  unsigned int userPermission = ReadPermission | WritePermission;

  checkPermission(userPermission);
}

在这个示例中,我们使用位或操作(|)将不同的权限标志合并到一个变量userPermission中。然后,我们使用位与运算符&来检查用户是否具有特定权限。根据位与运算的结果,我们可以控制对资源的读取、写入和执行权限。

这些示例展示了位运算符|的实际应用。它可以用于设置特定位、合并位字段和权限控制等位级别的操作。通过位或运算符,我们可以对二进制数据进行逐位的逻辑操作。

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值