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

c语言-位运算

位运算小结

​ 位运算不管是在C语言中,或者其他语言,都是经常会用到的,所以本文也就不固定以某种语言来举例子了,原始点就从01开始。位运算主要包括按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<)、右移(>>)这几种,其中除了取反(~)以外,其他的都是二目运算符,即要求运算符左右两侧均有一个运算量。

补码

在总结按位运算前,有必要先介绍下补码的知识,我们知道当将一个十进制正整数转换为二进制数的时候,只需要通过除2取余的方法即可,但是怎么将一个十进制的负整数转换为二进制数呢其实,负数是以补码的形式表示,其转换方式,简单的一句话就是:先按正数转换,然后取反加1

要将十进制的-10用二进制表示,先将10用二进制表示:
0000 0000 0000 1010
取反:
1111 1111 1111 010111111 1111 1111 0110
所以,-10的二进制表示就是:
1111 1111 1111 0110

按位与(&)

​ 参加运算的两个数,换算为二进制(01)后,进行与运算。只有当相应位上的数都是1时,该位才取1,否则该为为0

10-10进行按位与(&)运算:
0000 0000 0000 1010
1111 1111 1111 0110
-----------------------
0000 0000 0000 0010
所以:
10 & -10 = 0000 0000 0000 0010`

按位或(|)

​ 参加运算的两个数,换算为二进制(01)后,进行或运算。只要相应位上存在1,那么该位就取1,均不为1,即为0

10-10进行按位或(|)运算:
0000 0000 0000 1010
1111 1111 1111 0110
-----------------------
1111 1111 1111 1110
所以:
10 | -10 = 1111 1111 1111 1110`

按位异或(^)

​ 参加运算的两个数,换算为二进制(01)后,进行异或运算。只有当相应位上的数字不相同时,该为才取1,若相同,即为0

10-10进行按位异或(^)运算:
0000 0000 0000 1010
1111 1111 1111 0110
-----------------------
1111 1111 1111 1100
所以:
10 ^ -10 = 1111 1111 1111 1100`

​ 可以看出,任何数与0异或,结果都是其本身。利用异或还可以实现一个很好的交换算法,用于交换两个数,算法如下:

a = a ^ b;
b = b ^ a;
a = a ^ b;

取反(~)

​ 参加运算的两个数,换算为二进制(01)后,进行取反运算。每个位上都取相反值,1变成00变成1

10进行取反(~)运算:
0000 0000 0000 1010
---------------------
1111 1111 1111 0101
所以:
~10 = 1111 1111 1111 0101`

左移(<<)

​ 参加运算的两个数,换算为二进制(01)后,进行左移运算,用来将一个数各二进制位全部向左移动若干位。

10左移2(就相当于在右边加20)0000 0000 0000 1010
--------------------
0000 0000 0010 1000
所以:
10 << 2 = 0000 0000 0010 1000 = 40

注意,观察可以发现,左移一位的结果就是原值乘2,左移两位的结果就是原值乘4

右移(>>)

​ 参加运算的两个数,换算为二进制(01)后,进行右移运算,用来将一个数各二进制位全部向右移动若干位。

10右移2(就相当于在左边加20)0000 0000 0000 1010
--------------------
0000 0000 0000 0010
所以:
10 >> 2 = 0000 0000 0000 0010 = 2

​ 注意,观察可以发现,右移一位的结果就是原值除2,左移两位的结果就是原值除4,注意哦,除了以后没有小数位的,都是取整

http://www.lryc.cn/news/66497.html

相关文章:

  • 【Android学习专题】安卓样式学习(学习内容记录)
  • 普罗米修斯统计信息上报结构设计
  • 两个系统之间的传值
  • PostgreSQL(五)JDBC连接串常用参数
  • 如何修改浏览器中导航栏的背景色和字体
  • 如何选择合适的智能氮气柜?
  • 双向链表(数据结构)(C语言)
  • 离线安装Percona
  • 界面控件Telerik UI for WinForms使用指南 - 数据绑定 填充(二)
  • 通过栈/队列/优先级队列/了解容器适配器,仿函数和反向迭代器
  • leetcode 704. 二分查找
  • 蓝牙耳机什么牌子好?500内好用的蓝牙耳机推荐
  • 设计模式 -- 中介者模式
  • 人工智能的未来之路:语音识别的应用与挑战
  • c++ 友元介绍
  • 四维轻云地理空间数据在线管理软件能够在线管理哪些数据?
  • 学习 GitHub 对我们有什么好处?
  • java记录-反射
  • 这次彻底不需要账号了,无需魔法永久白嫖GPT
  • 远程桌面连接是什么?如何开启远程桌面连接详细教程
  • lua实战(2)
  • UI自动化测试案例——简单的Google搜索测试
  • C++之虚函数原理
  • Windows Information Protection(WIP)部署方案
  • 细说Hibernate的缓存机制
  • 初识C++之线程库
  • ChatGLM-LLaMA-chinese-insturct 学习记录(含LoRA的源码理解)
  • JuiceFS-K8s部署
  • 2023最新版本Camtasia电脑录屏软件好不好用?
  • 第三章 Linux 初步