《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.2 常用位操作符

简介:

本节书摘来自异步社区《嵌入式Linux与物联网软件开发——C语言内核深度解析》一书中的第2章,第2.2节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.2 常用位操作符


3b3c1ef8268aaad7c5364bf1d68b35a0b27224ac

2.2.1 位与(&)

位与就是对数的二进制位进行运算。两个数每个二进制位的运算规则按照如下规则运算。该规则就是其真值表。

& 0 1
0 0 0
1 0 1
从其运算规则(真值表)可以看出,只有1和1进行与运算的结果是1,其余的全是0。如果我们将1当做真,0当做假的话,按照与运算的要求,两个为真才为真,只要有一个为假就为假。好了,我们看下面一个例子。

3 & 5 = ?

分析可知这两个是十进制数,所以先把这两个数都转化为二进制数。

3转化二进制:0b0011

5转化二进制:0b0101

将这两个数的二进制形式按照上面的运算规则进行按位与运算。

0b0011 (3)
&    0b0101 (5)
=    0b0001 (1)

将得到的二进制结果0b0001变为十进制,十进制结果为1。

所以可以得出结论:`javascript
3 & 5 = 1。


扩展:&(按位与)和&&(逻辑与)的区别

&&(逻辑与)是将要运算的两个数看做一个整体,而这个整体如果是0,则该数被定义成逻辑假(0);如果该数不为0(不管是正的还是负的),则被定义成逻辑真(1)。来看几个小例子。

3 && 5 = ?

分析:3(逻辑真),5(逻辑真),真 && 真 = 真,所以结果为真,即```javascript
3 &`
& 5 = 1。

3 && 0 = ?

分析:3(逻辑真),0(逻辑假),真 && 假 = 假,所以结果为假,即`javascript
3 && 0 = 0。

3 && -5 = ?


分析:3(逻辑真), -5(逻辑真),真 && 真 = 真,所以结果为真,即```javascript
3
&& -5 = 1。

2.2.2 位或(|)

对两个数的二进制位进行或运算,其真值表如下。

| 0 1
0 0 1
1 1 1
从其真值表可以看出,只有0和0进行或运算的结果是0,其余的全是1。对于位或运算来说,运算的两个位,只要有一个为1结果就为1,否则都为0。如下面这个例子。

3 | 5 = ?

将十进制转化为二进制。

3转化为二进制:0b0011

5转化为二进制:0b0101

对这两个数的二进制形式按照上面的运算规则进行按位或运算。

0b0011 (3) 
|    0b0101 (5)
=    0b0111 (7)

将二进制结果0b0111转化为十进制,十进制结果为7。

所以可以得出结论:3 | 5 = 7。

扩展:|(按位或) 和 ||(逻辑或)的区别

||(逻辑或)是将要运算的两个数都看成一个整体,而这个整体如果是0,则该数被定义成逻辑假(0);如果该数不为0(不管是正的还是负的),则被定义成逻辑真(1)。来看下面这个小例子。

3 || 5 = ?

分析:3(逻辑真),5(逻辑真),真 || 真 = 真,所以结果为真,即3 || 5 = 1。

0 || 0 = ?

分析:0(逻辑假),0(逻辑假),假 || 假 = 假,所以结果为假,即0 || 0 = 0。

3 || -5 = ?

分析:3(逻辑真) -5(逻辑真),真 || 真 = 真,所以结果为真,即3 || -5 = 1。

2.2.3 位取反(~)

位取反就是将操作数的二进制位逐个按位取反(1变成0,0变成1),其真值表如下。

~0 = 1
~1 = 0

从上真值表中不难发现规律,取反后,1变0,0变1,比如下面这个例子。

~10 = ?

将十进制转化为二进制。

10转化为二进制:0b1010

对操作数的二进制形式按位取反。此处为了方便说明,暂时不考虑更高位补齐。实际编程位取反时要考虑取反的数的数据类型,然后在高位补足0,这时0会在取反时变为1。

~    0b1010 (10)
     0b0101 (5)

将二进制结果0b0101转化为十进制,结果为5。

所以可以得出结论:~10 = 5

扩展:~(按位取反) 和 !(非)的区别

!(非)是将操作数看成一个整体,而这个整体如果是0,则该数被定义成逻辑假(0);如果该数不为0(不管是正的还是负的),则被定义成逻辑真(1)。来看几个小例子。

!10 = ?

分析:10(逻辑真) 非真就是假,所以结果为假,即!10 = 0。

!0 = ?

分析:0(逻辑假) 非假就是真,所以结果为真,即!0 = 1。

!(-10) = ?

分析:-10(逻辑真) 非真就是假,所以结果为假,即!(-10) = 0。

2.2.4 位异或(^)

位异或就是将两个数的二进制位进行位异或运算。位运算的真值表如下。

^    0    1
0    0    1
1    1    0

从其运算规则(真值表)可以看出,两个位如果相等,结果为0,不等则结果为1。比如下面的例子。

3 ^ 5 = ?

将十进制转化为二进制。

3转化为二进制:0b0011

5转化为二进制:0b0101

将这两个数的二进制形式按照上面的运算规则进行按位与运算。

0b0011 (3)
^    0b0101 (5)
=    0b0110 (6)

将二进制结果0b0110转为十进制,十进制结果为6。

0b0110转化为十进制:6

所以可以得出结论:3 ^ 5 = 6。

2.2.5 左移位(<<)

左移位就是将一个操作数的各二进制位全部左移若干位,左边移出去的二进制位丢弃,右边空出的二进制位补0。话不多说,来看个例子。

5 << 2 = ?

将十进制化为二进制。

5转化为二进制:0b00000101

对操作数0b00000101开始进行左移位两次。

0b00000101 (5)

第一次左移位 0b00001010 (10) = 5 * 2

第二次左移位 0b00010100 (20) = 10 * 2

将二进制结果0b00010100转为十进制,十进制结果为20。

所以可以得出结论:5 << 2 = 20。在这个移位的过程中,我们也发现了一个规律,每进行一次左移位操作,得到的结果是原操作数的一倍(x << n = x * 2^n)。

2.2.6 右移位(>>)

右移位就是将一个操作数的各二进制位全部右移若干位,左边的二进制位补0或者补1(如果操作数是无符号数或有符号正数就补0,如果是有符号负数就补1),右边的二进制位丢弃。话不多说,来看例子。

5 >> 2 = ? (-5) >> 2 = ?

将十进制转化为二进制。

5转化为二进制:0b00000101

-5转化为二进制:0b11111011

对操作数0b00000101开始进行右移位两次。

0b00000101 (5)        0b11111011 (-5)

第一次右移位:0b00000010 (2) = 5 / 2  0b11111101 (-3)

第二次右移位:0b00000001 (1) = 2 / 1  0b11111110 (0)

将得出的结果(二进制)还原成十进制形式。

0b00000001转化为十进制:1

0b11111110转化为十进制:0 (按照负数解析)

所以可以得出结论:5 >> 2 = 1。在这个移位的过程中,我们也同样发现了一个规律,每进行一次右移位操作,得到的结果是原操作数的一半(x >> n = x / 2^n)。

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
11天前
|
C语言
C语言操作符(补充+面试)
C语言操作符(补充+面试)
23 6
|
7天前
|
存储 编译器 C语言
十一:《初学C语言》— 操作符详解(上)
【8月更文挑战第12天】本篇文章讲解了二进制与非二进制的转换;原码反码和补码;移位操作符及位操作符,并附上多个教学代码及代码练习示例
19 0
十一:《初学C语言》—  操作符详解(上)
|
15天前
|
Linux 数据安全/隐私保护 Perl
解锁Linux高手秘籍:文件操作+命令解析大揭秘,面试场上让你光芒万丈,技术实力惊艳四座!
【8月更文挑战第5天】Linux作为服务器与嵌入式系统的基石,其文件管理和命令行操作是技术人员必备技能。本文从文件操作和基础命令两大方面,深入浅出地解析Linux核心要义,助你在面试中脱颖而出。首先探索文件系统的树状结构及操作,包括使用`ls -la`浏览文件详情、`touch`创建文件、`rm -r`慎删目录、`cp`与`mv`复制移动文件、以及利用`find`搜索文件。接着掌握命令行技巧,如用`cat`、`more`和`less`查看文件内容;借助`grep`、`sed`与`awk`处理文本;运用`ps`、`top`和`kill`管理进程;并通过`chmod`和`chown`管理文件权限。
53 8
|
23天前
|
Linux C语言 Windows
C语言文件编程-Linux环境下运行
本文介绍了在Linux环境下使用C语言进行文件编程时的两种主要接口:C标准库函数与Linux系统调用。C标准库提供了`fopen`, `fread`, `fwrite`, 和 `fclose`等函数,适用于普通文件操作;而Linux系统调用如`open`, `read`, `write`, 和 `close`则更适合处理设备文件,同时也可用于普通文件。这两种方法的主要区别在于前者使用文件指针,后者使用文件描述符。文章还给出了两个示例程序:一个使用C标准库函数实现文件复制,另一个则使用Linux系统调用完成相同任务。
19 2
|
1天前
|
存储 C语言 索引
【C语言篇】操作符详解(下篇)
如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。
|
1天前
|
程序员 编译器 C语言
【C语言篇】操作符详解(上篇)
这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。
|
27天前
|
Ubuntu 算法 Linux
嵌入式Linux的学习误区
**嵌入式Linux学习误区摘要** 1. **过度聚焦桌面Linux** - 许多学习者误将大量时间用于精通桌面Linux系统(如RedHat、Fedora、Ubuntu),认为这是嵌入式Linux开发的基石。 - 实际上,桌面Linux仅作为开发工具和环境,目标不应是成为Linux服务器专家,而应专注于嵌入式开发工具和流程。 2. **盲目阅读Linux内核源码** - 初学者在不了解Linux基本知识时试图直接研读内核源码,这往往导致困惑和挫败感。 - 在具备一定嵌入式Linux开发经验后再有针对性地阅读源码,才能有效提升技能。
22 4
|
28天前
|
Linux
《解析 Linux 命令:systemd-delta》
`systemd-delta`: 解析Linux服务配置差异。概览: 显示服务单元文件与默认配置的对比,助于配置问题排查与系统审计。特点: 清晰展示修改点,涵盖启动选项等。示例: `systemd-delta [--plain] &lt;service&gt;`. 注意: 理解默认配置,谨慎修改,定期检查。掌握此命令,深化系统服务配置洞察,优化Linux管理。#Linux #systemd-delta
|
1月前
|
域名解析 缓存 网络协议
深入理解Linux下的DNS技术
Linux DNS详解:连接用户与网络资源的关键,涉及基本原理、DNS服务器软件如BIND、PowerDNS、Dnsmasq、解析过程、缓存及系统配置。理解这些有助于优化网络性能和安全。配置文件 `/etc/resolv.conf` 用于指定DNS服务器,而DNS缓存提升响应速度。学习DNS技术,提升系统效率与可靠性。
55 7
|
1月前
|
存储 监控 Linux
stdbuf命令在Linux中的深度解析
`stdbuf`是Linux工具,用于控制命令的stdin、stdout和stderr的缓冲模式。它可以设置为无缓冲、行缓冲或块缓冲,以优化数据处理和实时性。例如,`stdbuf -o0 cmd`禁用cmd的输出缓冲,`-oL`则按行缓冲。在需要实时监控或高效处理大量数据时,选择合适的缓冲模式至关重要。注意,过度使用无缓冲可能影响性能,并非所有系统都支持`stdbuf`。

相关产品

  • 物联网平台