前言
本篇文章给大家讲解一下C语言中的位操作,在嵌入式中位操作是经常需要使用的,那么下面就让我们来学习一下C语言中的位操作吧。
一、左移和右移
在C语言中,左移(<<)和右移(>>)是位操作运算符,用于对整数类型的数据进行位级操作。这些操作符可以将二进制表示的整数值按指定的位数向左或向右移动,并根据移动方向填充或丢弃相应的位。
左移运算符(<<)将一个数的各二进制位全部左移若干位,右侧空出的位用零填充。其语法为:
result = operand << n;
其中,operand是要进行操作的数值,n是要左移的位数,result是计算结果。左移运算的效果是将operand的二进制表示左移n位。
例如,假设有一个整数变量 x 的值为 5,其二进制表示为 0000 0101,我们对其左移两位,即 x << 2:
int x = 5; int result = x << 2;
左移两位后,二进制值变为 0001 0100(二进制表示),对应的十进制数即为 20。因此,result的值将为 20。
右移运算符(>>)将一个数的各二进制位全部右移若干位,但右移运算符有两种方式:逻辑右移和算术右移。
逻辑右移(logical right shift):右移过程中左侧空出的位用零填充,适用于无符号数。
算术右移(arithmetic right shift):右移过程中左侧空出的位用符号位填充,适用于带符号数。
其语法为:
result = operand >> n;
其中,operand是要进行操作的数值,n是要右移的位数,result是计算结果。右移运算的效果是将operand的二进制表示右移n位。
例如,有一个有符号整数变量 x 的值为 15(二进制表示为 0000 1111),我们对其右移三位,即 x >> 3:
int x = 15; int result = x >> 3;
逻辑右移后,二进制值变为 0000 0001,对应的十进制数为 1,因此 result 的值将为 1。
需要注意的是,右移运算对于带符号整数会保留符号位,因此如果原始数值为负数(符号位为 1),算术右移将填充 1,使得结果仍为负数。
二、清除对应的位为0和设置对应的位为1
在嵌入式中设置和清除某位是非常常用的,这里我们就来看看怎么设置某位为1和清除某位为0吧。
1.设置对应的位为1
#include <stdio.h> int main(void) { unsigned char a = 0; int i = 0; scanf("%d", &i); printf("a = %d\n", a | (1 << i));//设置第i位为1 return 0; }
通过位运算符 | 将 1 左移 i 位,并将结果与变量 a 进行按位或操作。这样可以将变量 a 的第 i 位设置为 1,而其他位保持不变。
2.清除对应的位为0
#include <stdio.h> int main(void) { unsigned char a = 255; int i = 0; scanf("%d", &i); printf("a = %d\n", a & ~(1 << i)); return 0; }
通过位运算符 ~ 将 1 左移 i 位,并将结果与变量 a 进行按位与操作。这样可以将变量 a 的第 i 位设置为 0,而其他位保持不变。
三、进制数的表示
在C语言中,数字可以用不同的进制表示,包括十进制、八进制和十六进制。以下是这些进制的表示方法以及相应的C代码示例:
1.十进制:十进制是我们日常生活中最常见的进制,数字默认情况下就是十进制的。例如,数字42就是十进制。
int decimalNumber = 42;
2.八进制:在C语言中,八进制数字以0开头。例如,八进制数字052表示十进制的42。
int octalNumber = 052;
3.十六进制:十六进制数字以0x或0X开头。例如,十六进制数字0x2A表示十进制的42。
int hexadecimalNumber = 0x2A;
这些示例展示了如何在C语言中表示不同进制的数字。你可以使用这些表示法来初始化整数变量,进行算术运算,或者将它们输出到屏幕上。注意,C语言中默认情况下使用的是十进制,如果你需要在其他进制之间进行转换,可能需要使用相关的函数或操作来实现。
四、& ^ | ~
1.按位与 &:
运算符:&
功能:执行按位与操作,将两个操作数的对应位进行比较,如果两个位都为1,则结果位为1,否则为0。
示例代码:
int x = 5; // 二进制表示为 0101 int y = 3; // 二进制表示为 0011 int result = x & y; // 结果为 0001,即 1
2.按位或 |:
运算符:|
功能:执行按位或操作,将两个操作数的对应位进行比较,如果任何一个位为1,则结果位为1。
示例代码:
int x = 5; // 二进制表示为 0101 int y = 3; // 二进制表示为 0011 int result = x | y; // 结果为 0111,即 7
3.按位异或 ^:
运算符:^
功能:执行按位异或操作,将两个操作数的对应位进行比较,如果两个位不同,则结果位为1,如果相同则为0。
示例代码:
int x = 5; // 二进制表示为 0101 int y = 3; // 二进制表示为 0011 int result = x ^ y; // 结果为 0110,即 6
4.按位取反 ~:
运算符:~
功能:执行按位取反操作,翻转一个整数的每个二进制位,将1变为0,将0变为1。
示例代码:
int x = 5; // 二进制表示为 0101 int result = ~x; // 结果为 1010,即 -6(根据补码表示)
总结
本篇文章就讲解到这里,希望大家将上面讲解的知识牢牢掌握。