当前位置: 首页 > news >正文

c语言位运算符速成

本篇文章对c语言速成系列的补充,其中的内容会涉及原反补以及& 、| 、 ~ 、^、位运算等等。那么,闲话少叙,我们直接进入正题

目录

进制转换(前置知识)

二进制转十进制

二进制转八进制

二转十六进制

原反补之间的相互转换

什么是原码?

什么是反码?

什么是补码?

按位与&

运算规则

小妙招

按位或|

运算规则

小妙招

操作符取反

按位异或^

拓展部分

左右移运算符(<<和>>)

左移运算符​编辑

右移运算符 

逻辑右移

算术右移

单目操作符

逗号表达式

结构体的直接与间接访问操作符

直接访问操作符:.

间接访问操作符:->

下标引用操作符


首先我们先来讲讲原反补

进制转换(前置知识)

在学原反补之前我们先来学几个机制转换的技巧

二进制转十进制

首先就是权重,也许会有小伙伴不理解权重,那么权重是什么东西呢?请看下图

从上图中我们可以很明显地看出权重其实就是10的n次方,那么二进制呢也是和十进制是一样的,也是有权重这一概念,也就是2的n次方

什么?你听到这里就更加模糊了,别急我们这就上大招。

识别:2——>10(二进制转十进制)

技巧:8421法

那么怎么使用呢请看下图

二进制转八进制

上面的专业内容有兴趣可以看一下,这里我们直接上大招

识别:2->8

技巧:421法

二转十六进制

识别:2->16

技巧:8421按位填,位数之和小于10,数字从0到9网上填,位数之和9之上,小写a到f替

总结:

学完了前置知识,那么我们就可以来学原反补了

原反补之间的相互转换

整数(包括有符号的整数)的二进制有三种:分别是原码、反码、补码,并且均有数值位和符号位

最高位也就是原码的32个1、0中的第一个数就是它的符号位(不懂没关系下面会细讲),符号位中0位正,1为负

什么是原码?

直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。

什么是反码?

将原码的符号位不变,其他位依次按位取反就可以得到反码。

什么是补码?

反码+1就得到补码。

符号位就是原反补码的第一个数,后面的数全是是数值位

那么总结一下它们之间的转换思路

总结:

原码:十进制(这里不一定是十进制,也可以是八进制或十六进制)->二进制

原码->反码:符号位不变,数值位为1的改为0,为0的改1

反码->补码:反码+1就得到补码。

按位与&

运算规则

只有两个数的二进制同时为1,结果才为1,否则为0。(负数按补码形式参加按位与运算)

举例:int x = 3,  y = 5

x的二进制:00000011

y的二进制:00000101

x&y = 00000001

从上述的例子和运算规则我们可以总结一个小妙招

小妙招

同则1,异则0

按位或|

运算规则

参加运算的两个数只要两个数中的一个为1,结果就为1。

举例:

int x = 3,  y = 5;

x的二进制:00000011

y的二进制:00000101

那么这里直接上小妙招

小妙招

有1则为1

操作符取反~

定义: 取反操作符是位运算符的中一个,作用是按位补运算符翻转操作数的每一位

举例:

int x = 3;

x(10 -> 2) = 00000011

x~ = 11111100

总结:0变1,1变0

解释:原来是0的变为1, 原来是1的变为0

按位异或^

运算规则:参加运算的两个数,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。

举例:

int x = 3, y = 5;

x(10->2) = 00000011

y(10->2) = 00000101

x ^ y = 00000110

必备知识点:0 ^ 0 = 0     0 ^ 1 = 1

总结:值相同则为0,值不同则为1 

拓展部分

算法题

关键词:只出现一次的元素

思路

代码编写

class Solution {
public:int singleNumber(vector<int>& nums) {int val = 0;for(auto cur : nums){val ^= cur;}return val;}
};

那么我们可以从这题里面得出来的,就是同则+,异则-

总结

运算规则:值相同则为0,值不同则为1 

额外拓展:同则加,异则减

左右移运算符(<<和>>)

左移运算符

移位规则:左边抛弃、右边补0

右移运算符 

逻辑右移

移位规则:左边补0,右边丢弃

算术右移

移位规则:左边⽤原该值的符号位填充,右边丢弃

总结:

左移运算符:左边补0,右边丢弃

逻辑右移:左边补0,右边丢弃

算术右移:左边⽤该值的原符号位填充,右边丢弃

单目操作符

逗号表达式

结构体的直接与间接访问操作符

直接访问操作符:.

使用格式:结构体变量.成员名

间接访问操作符:->

#include struct Point

{

int x;

int y;

};

int main()

{

struct Point p = {3, 4};

struct Point *ptr = &p;

ptr->x = 10;

ptr->y = 20;

printf("x = %d y = %d\n", ptr->x, ptr->y);

return 0;

}

使用格式:结构体指针.成员变量名

下标引用操作符

int arr[10];// 创建数组

arr[9] = 10;// 实⽤下标引⽤操作符。

使用格式:⼀个数组名+⼀个索引值

了解即可

本篇文章的内容到此结束了,本篇文章的结束代表着c语言速成系列的结束,但不代表学习的结束,学无止境,未来可期

都看到这里了,客官给个三联呗


http://www.mrgr.cn/news/24914.html

相关文章:

  • SciPy 模块列表
  • 如何删除电脑系统桌面文件右键菜单多余选项
  • 用Blender来烘培模型材质
  • 赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践
  • 如何在 Ubuntu 系统上部署 Laravel 项目 ?
  • Java 每日一刊(第4期):Java 23 即将发布
  • Ae软件2018-2023全版本 不限速下载
  • C语言 | Leetcode C语言题解之第399题除法求值
  • Python | Leetcode Python题解之第400题第N位数字
  • Spring Cloud(一)
  • 3个热门、好用、功能强大的C#开源帮助工具类
  • 日志管理之Logrotate
  • 使用Linq进行多表查询(C#)
  • 真正解决微信截图卡住(假死)
  • 【AcWing】快速排序的Go实现
  • Python中的类(一)
  • 【PyQt6 应用程序】在用户登录界面实现密码密文保存复用
  • 误删?损坏?别怕!固态硬盘数据恢复工具助你轻松找回
  • UE5——笔刷Brush工具
  • Qt第三课 ----------按钮的控件属性