帮别人做数学题赚钱的网站,如何检查网站死链,烟台市建设工程招标投标协会网站,wordpress博客做seo若协议中如下图所示#xff1a; 注意#xff1a; 长度为1#xff0c;表示1个字节#xff0c;也就是0xFF#xff0c;也就是 1111 1111 #xff08;这里0xFF只是单纯表示一个数#xff0c;也可以是其他数#xff0c;这里需要注意的是1个字节的意思#xff09; 一、按位… 若协议中如下图所示 注意 长度为1表示1个字节也就是0xFF也就是 1111 1111 这里0xFF只是单纯表示一个数也可以是其他数这里需要注意的是1个字节的意思 一、按位与 有0则0全1则11010 0011 00100xef 0xfe 0xee 0x1110 1111 0x1111 1110 0x1110 1110 1.1 配合左移运算符 取指定的位 说明DEC表示十进制、BIN表示二进制、HEX表示十六进制 #include stdio.h
// (DEC)64 BIN0011 0100 (HEX)0x34int main()
{ int data 0x34; // 定义位掩码int greenMask 1 0; // 绿灯int yellowMask 1 1; // 黄灯int redMask 1 2; // 红灯int buzzerMask 1 3; // 蜂鸣器int blueMask 1 4; // 蓝灯int whiteMask 1 5; // 白灯// 检查并打印状态if((data greenMask) 0) printf(绿灯灭 ); else printf(绿灯亮 );if((data yellowMask) 0) printf(黄灯灭 ); else printf(黄灯亮 );if((data redMask) 0) printf(红灯灭 ); else printf(红灯亮 );if((data buzzerMask) 0) printf(蜂鸣器停 ); else printf(蜂鸣器响 );if((data blueMask) 0) printf(蓝灯灭 ); else printf(蓝灯亮 );if((data whiteMask) 0) printf(白灯灭\n); else printf(白灯亮\n);printf(\n\n);printf(Green Mask Value: 0x%x\n, greenMask);printf(Yellow Mask Value: 0x%x\n, yellowMask);printf(White Mask Value: 0x%x\n, whiteMask);return 0;
}输出 绿灯灭 黄灯灭 红灯亮 蜂鸣器停 蓝灯亮 白灯亮Green Mask Value: 0x1 // 0x1 0001Yellow Mask Value: 0x2 // 0x2 0010White Mask Value: 0x20 // 0x20 10 0000 在C语言中 是位左移运算符。当你有一个整数值在这个例子中是1并对其使用左移运算符意味着你将该数值的二进制表示向左移动指定位数。每向左移一位数值就相当于乘以2因为二进制系统下每一位代表的权重是2的幂次。 具体到你的代码示例 int greenMask 1 0;表示将1二进制表示为00000001向左移动0位实际上没有移动所以greenMask的值为1对应二进制的最低位这里是用来控制绿灯的。int yellowMask 1 1;将1向左移动1位得到00000010即十进制的2用作黄灯的控制位。int redMask 1 2;向左移2位得到00000100即十进制的4对应红灯控制位。int buzzerMask 1 3;移动3位得到00001000即十进制的8用于蜂鸣器。int blueMask 1 4;移动4位得到00010000即十进制的16对应蓝灯。int whiteMask 1 5;移动5位得到00100000即十进制的32控制白灯。 这样每个掩码变量都对应了一个特定的位可以用来单独控制或检测某个功能的状态。在后续的条件判断中通过按位与操作()检查data中的特定位是否为1以此来确定对应设备的状态开启或关闭。 1.2 整体按位与
#include stdio.h// 0x64 0110 0100 0x34 0011 0100int main() {int targetState 0x34; // 这个掩码代表了指定的状态白灯蓝灯亮蜂鸣器停红灯亮黄绿灯灭int data_1 0x64; // 数据假设这就是我们得到的数据int data_2 0x34;// 使用按位与操作来检查data是否匹配targetStateif((data_1 targetState) targetState) {printf(状态匹配白灯亮 蓝灯亮 蜂鸣器停 红灯亮 黄灯灭 绿灯灭\n);} else {printf(状态不匹配\n);}if((data_2 targetState) targetState) {printf(状态匹配白灯亮 蓝灯亮 蜂鸣器停 红灯亮 黄灯灭 绿灯灭\n);} else {printf(状态不匹配\n);}return 0;
}输出
状态不匹配
状态匹配白灯亮 蓝灯亮 蜂鸣器停 红灯亮 黄灯灭 绿灯灭 1.3 清零状态
#include stdio.hint main() {// 定义位掩码int greenMask 1 0; // 绿灯int yellowMask 1 1; // 黄灯int redMask 1 2; // 红灯int buzzerMask 1 3; // 蜂鸣器int blueMask 1 4; // 蓝灯int whiteMask 1 5; // 白灯// 假设初始状态int data 0b01101000; // 二进制表示举例绿灯灭、黄灯灭、红灯亮、蜂鸣器停、蓝灯亮、白灯亮// 打印原始状态printf(原始状态: );if((data greenMask) 0) printf(绿灯灭 ); else printf(绿灯亮 );if((data yellowMask) 0) printf(黄灯灭 ); else printf(黄灯亮 );if((data redMask) 0) printf(红灯灭 ); else printf(红灯亮 );if((data buzzerMask) 0) printf(蜂鸣器停 ); else printf(蜂鸣器响 );if((data blueMask) 0) printf(蓝灯灭 ); else printf(蓝灯亮 );if((data whiteMask) 0) printf(白灯灭\n); else printf(白灯亮\n);// 创建清零所有灯的掩码int clearLightsMask ~(greenMask | yellowMask | redMask | blueMask | whiteMask);// 使用按位与操作清零所有灯的状态data clearLightsMask;// 打印更新后的状态printf(清零灯状态后: );if((data greenMask) 0) printf(绿灯灭 ); else printf(绿灯亮 );if((data yellowMask) 0) printf(黄灯灭 ); else printf(黄灯亮 );if((data redMask) 0) printf(红灯灭 ); else printf(红灯亮 );if((data buzzerMask) 0) printf(蜂鸣器停 ); else printf(蜂鸣器响 );if((data blueMask) 0) printf(蓝灯灭 ); else printf(蓝灯亮 );if((data whiteMask) 0) printf(白灯灭\n); else printf(白灯亮\n);return 0;
}输出
原始状态: 绿灯灭 黄灯灭 红灯灭 蜂鸣器响 蓝灯灭 白灯亮
清零灯状态后: 绿灯灭 黄灯灭 红灯灭 蜂鸣器响 蓝灯灭 白灯灭 综合
示例 1 要求 取一个数的高八位与低八位并将二者的顺序替换 涉及操作 取一个数中的某些值将两个8位的数合并为一个16位的数 #include stdio.h
#include stdint.hint main() {uint16_t combinedData 0b0110011110110100; // (BIN) 0110011110110100 (HEX) 0x67B4uint8_t highByte combinedData 8; // 取左边的八位uint8_t lowByte combinedData 0xFF; // 取右边的八位printf(Combined data in hexadecimal: 0x%x\n, combinedData);printf(highByte data in hexadecimal: 0x%x\n, highByte);printf(lowByte data in hexadecimal: 0x%x\n, lowByte);// 调换高八位与低八位顺序combinedData (lowByte 8) | highByte; // 右边的八位左移后变成16位再与原本的左边八位取或printf(Combined data in hexadecimal: 0x%x\n, combinedData);return 0;
}输出Combined data in hexadecimal: 0x67b4highByte data in hexadecimal: 0x67lowByte data in hexadecimal: 0xb4Combined data in hexadecimal: 0xb467比如是在串口接收的时候if(upAck-funcCode0x03) // 表示要读寄存器时{// upAck-regAmt 为寄存器的数量若一个寄存器为16位for(u16 i 0; i upAck-regAmt; i2) // 每两个字节一组进行高低字节交换{u16 lowByte MeterAck-data[i]; // 保存低字节u16 highByte MeterAck-data[i1]; // 保存高字节// 组合成正确的16位值此时lowByte已经是低字节highByte是高字节u16 temp (highByte 8) | lowByte; // 分别提取高字节和低字节到响应缓冲区upAck-rdata[i] highByte; // 高字节upAck-rdata[i1] lowByte; // 低字节}}
示例 2 要求: 检测所有器件是否全部停止 涉及操作 位与操作 #include stdio.hint main()
{ int data_0 0x34; // (DEC)64 BIN0011 0100 (HEX)0x34int data_1 0x00;if (data_0 0x3F) // 0x3F 0011 1111printf(存在器件在运行\n);else printf(所有已经停止\n);if (data_1 0x3F) // 0x3F 0011 1111printf(存在器件在运行\n);else printf(所有已经停止\n);return 0;
}输出存在器件在运行所有已经停止