来谈谈C++ 位运算 & | << >> ^ ~ %

C++中的位运算 基本知识   最近博主在刷Leedcode题,很多人都是采用位运算来解题的,看的我满脸雾水,所以上网收集了一下c++中关于位运算的知识,为此总结一下,有不妥的地方还望指正。   程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是11... 阅读详情

老实说,我对+ = * / % && || ==一些比较简单的运算符比较熟悉。对位运算就陌生了,主要用的少。我觉得高手用的会比较多,因为位运算速度比较快。位运算应该适用于大多数的语言,不限于c++

 

1.&

 

如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。

注:下面都用8位的 unsigned char 来做例子。

 

&简单举例:

 

11&3  = 3

 

     00001011

&   00000011

=   00000011 = 3

 

&比较实用的例子:

比如我们经常要用的是否被2整除,一般都写成   if(n % 2 == 0)

可以换成 if((n&1) == 0)

 

2. |

 

如果两个相应的二进制位只要有一个是1,结果就是1;否则为0。

 

| 简单例子:

 

11 | 3 = 11

     00001011

|    00000011

=   00001011 = 11

 

| 比较实用的例子

可以用一个unsigned int 来存储多个布尔值。比如一个文件有读权限,写权限,执行权限。看起来要记录3个布尔值。我们可以用一个unsigned int也可以完成任务。

 

一个数r来表示读权限,它只更改个位来记录读权限的布尔值

00000001  (表示有读权限)

00000000  (表示没有读权限)

 

一个数w表示写权限,它只用二进制的倒数第二位来记录布尔值

00000010 (表示有写权限)

00000000 (表示没有写权限)

 

一个数x表示执行权限,它只用倒数第三位来记录布尔值

00000100 (表示有执行权限)

00000000 (表示没有执行权限)

 

那么一个文件同时没有3种权限就是

~r | ~ w | ~ x 即为 00000000,就是0

 

只有读的权限就是

r | ~w | ~x 即为 00000001,就是1

只有写的权限就是

~r | w | ~x 即为 00000010,就是2

…

一个文件同时有3种权限就是

r | w | x 即为 00000111,就是7

 

3. << 向左移位移

 

<<简单例子(向左移一位,右边自动补0)

11 << 1 = 22

  00001011 << 1

  00010110 = 22

相当于二进制的每个数都变成当前值的两倍,结果就是变成当前值的两倍。

n * 2 == (n << 1)

推广下就是(注意可能会溢出)

 

4. >> 向右位移

 

>>简单例子(向右移一位,左边自动补1(补0?))

11 >> 1 =  5

00001011 >> 1

00000101 = 5

注意到最后一位的1被干掉了。

比较实用的例子是:

int n = n / 2     等价于   int n = n >> 1  等价于 int n >>= 1

 

 

5. ^ 异或

 

两个相同的数会变成0,反之是1

例子:

11^3 = 8

     00001011

^   00000011

=   00001000 = 8

 

我觉得理解异或,一定要用异或来解下面的题目:

Given an array of integers, every element appearstwice except for one. Find that single one.

就是一个数组中,所有数字都出现了两次,只有一个没有

比如 int t = {1,2,3,3,2,1,5} 要找到5。

用异或就完美了,所有相同的都会消失,留下来的就是5了。我发现异或是嫉妒成双成对的。

?
1
2
3
4
5
6
int singleNumber( int A[], int n) { 
         for ( int i = 1; i < n; ++i){ 
            A[0] ^= A[i]; 
         } 
         return A[0]; 
     }

还有就是用不tmp值来交换两个数

 

?
1
2
3
4
5
6
7
//不用temp交换两个整数
void swap( int & x , int & y)
{
     x ^= y;
     y ^= x;
     x ^= y;
}

 

扯点别的,^在lua中表示pow的意思,这是要逆天。

 

6 ~

 

这个在加法中用到

x-y = x + ~y + 1

所以~y = – y  -1

 

比如 ~11 = -11 -1 = -12

 

7 再扯下%

 

居然有道题目是这样的: 求 100 % 8的 优化解法。我们知道:

8刚好是2的3次方

所以 100 % 8 == 100 – math.floor(100 / 8) * 8 == 100 -  ((100 >> 3) << 3)

 

8.位运算优先级

 

总的来说比较低,一定要加括号。


转载:http://www.waitingfy.com/archives/1004

Tags: 位运算

GESP C++三级备考指南:位运算实战技巧与常见应用解析 本文为GESP C++三级考生提供了一份全面的位运算实战指南。文章深入浅出地解析了与、或、非、异或、左移、右移六大核心操作,并结合高效算术、状态压缩、二进制枚举等高频应用场景,帮助读者掌握编写高性能代码的关键技巧。同时,文中指出了运算符优先级、有符号数右移等常见陷阱,助力考生在考试与实战中灵活运用位运算,夯实编程基础。 阅读详情

相关推荐

别再只看成交量了!用通达信这个VOL监测公式,一眼识别主力吸筹与出货信号

本文详细介绍了通达信VOL监测公式的实战应用,通过彩色量柱和换手率分层技术,帮助投资者识别主力吸筹与出货信号。该公式结合动态量能标准化和多周期均线组合,提供可视化主力行为图谱,提升交易决策的准确性。

weixin_28693447的博客 662

按位运算符& | ~ ^ >> <<

大多数语言都提供了按位运算符,按位运算符在c,c++等语言中运用广泛,而在JS,AS等脚本语言中则没有太多的应用例子,有时候,适当的使用按位运算符会取得很好的效果。 下面根据自己的认知简单的谈一下js中的位操作使用(同样适用于其他语言),如果有错误,欢迎指正(本文中所有示例,都位一字节8位,具体位数因所使用的编程语言不同,而不同,java int型为4字节32位,位数不同会导致不同的计算结果请注

椰汁菠萝 4689

ROS2实战:手把手教你用walking机器人仿真实现医院多楼层自动配送(含实时地图切换)

本文详细介绍了如何利用ROS2和walking机器人仿真平台实现医院多楼层自动配送系统,重点讲解了动态地图切换技术和多楼层导航的实现方法。通过实时加载地图和优化电梯过渡策略,解决了医院复杂环境下的自主配送难题,为医疗物流自动化提供了实用解决方案。

weixin_29090917的博客 364

操作符(<< >> & | ^)与例题讲解

操作符以及其运用的例题。

Djsnxbjans的博客 1962

苹果搜索广告ASA开户教程

阅读导航 一、创建账号 1、登录网站 2、填写账号主体信息 3、填写商家和发票信息 4、选择付款方式 二、上传审核材料 1、上传文件 2、请求审批 3、上传文件中的常见问题 一、创建账号 1、用Apple ID登录ASA网站 首先我们进入开户网址:https://app-ads.apple.com/ 如果已拥有Apple ID,直接登录即可,如果没有Apple ID,可以先按照步骤创建Apple ID,再返回登录。 注意,这里登录的Apple ID也有讲究: ① 如果是开发

testflight121的博客 2130

从零到一:R与RStudio的安装与配置全攻略

本文提供了R与RStudio的完整安装与配置指南,涵盖Windows、Mac和Linux三大操作系统。从基础环境搭建到高级性能优化,详细介绍了R语言安装、RStudio配置、项目管理和实用技巧,帮助数据科学初学者快速搭建高效的分析工作环境。

weixin_29062671的博客 420

C/C++中位操作符(&,|,^,~)的详解使用

位操作符(&,|,^,~)与,或,异或,按位取反的详解

m0_74316391的博客 2312

Windows平台高效BLE调试工具开发指南

本文为开发者提供了一份在Windows平台上开发高效BLE调试工具的详细指南。文章深入探讨了使用32feet.NET库进行蓝牙低功耗设备扫描、连接、数据通信及进阶功能开发的实战经验,旨在帮助开发者打造功能自定义、性能优化的专属调试利器,显著提升物联网和嵌入式设备的调试效率。

weixin_29201933的博客 256

关于 C、C++里面 scanf() 与printf() 里面 %d %lld 使用总结

关于scanf() int 与 long long int 输入输出问题     1、如果 输入数不超过 INT_MAX         INT_MAX 内存模型为 最高位符号位 0 其他位(共31为)      此时,定义为int 或者 long Long 用%d %lld 读写 都没有影响     以下的前提是在 INT_MAX 范围内才满足:如果     (1)允许定义长整型,用短整型输...

Unyielding will 1万+

QTableView实现表格加载百万条数据

本文介绍用QTableView实现加载100万条数据显示到表格。 1.创建工程 用Qt Creator创建Qt Widgets Application项目,基类选择QWidget,创建好了,如图: 2.添加QTableView控件 在widget.ui中添加QTableView控件,和QPushButton,采用栅格布局,如图: 3.添加函数 头文件 QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Wid

丁爸的博客 8272

使用LSTM实现自动调制识别(RML2018.01a)

目录一、LSTM的代码实现1.1 导入包1.2 数据读取及数据集划分1.3 数据预处理1.4 构建LSTM模型 本文基于RML2018.01a大型数据集,给出LSTM的信号识别的实现方式(附代码) RML2018.01a数据集信息如下: 模型 传送门 CNN/ResNet 使用CNN/ResNet实现自动调制识别(RML2018.01a) LSTM 使用LSTM实现自动调制识别(RML2018.01a)) 一、LSTM的代码实现 1.1 导入包 import numpy as np

QAQIknow的博客 6123

位运算 c语言 头文件 linux,来谈谈C++ 位运算 & | << >> ^ ~ %

老实说,我对+ = * / % &amp;&amp; || ==一些比较简单的运算符比较熟悉。对位运算就陌生了,主要用的少。我觉得高手用的会比较多,因为位运算速度比较快。位运算应该适用于大多数的语言,不限于c++1.&amp;如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。注:下面都用8位的 unsigned char 来做例子。目录 [隐藏]&amp;简单举例:&amp;比较实用的例...

weixin_33570610的博客 373

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an &ldquo;advanced algorithms&rdquo; book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

来谈谈C++ 位运算 & | << >> ^ ~ %

老实说,我对+ = * / % && || ==一些比较简单的运算符比较熟悉。对位运算就陌生了,主要用的少。我觉得高手用的会比较多,因为位运算速度比较快。 1.& 如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。 注:下面都用8位的 unsigned char 来做例子。 &简单举例: 11&3 = 3 00001011 &

易水寒 2万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

神奇的C++位运算& | << >> ^ ~ %

为什么说神奇呢?诸位看看耐心向后,第七点这种计算方法你是否之前也想到过? 1.& 如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。 注:下面都用8位的 unsigned char 来做例子。 &简单举例: 11&3  = 3      00001011 &   00000011 =   0000

机器人梦想家 Bing Lee 2497

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

位运算以及c++二进制输出以及bool的使用

首先我们都知道计算机是用二进制的形式保存数据的 那么如何用c++输出一个二进制的数呢 有以下几种方式 第一种: #include &lt;iostream&gt; using namespace std; int main() { int n, i, j; bool arr[100]; while(cin &gt;&gt; n) { i = 0; ...

jzhlittle的博客 1795

位运算(& | ~ ^ >> <<)

二进制中1的个数 算法1、(暴力枚举) O(nlongn) 思路: 对于每个数字a,a&amp;1得到了该数字的最后一位,之后将a右移一位,直到位0,就得到了1的个数 C++ 代码 #include&lt;iostream&gt; using namespace std; int n; int a,k; int main(){ scanf("%d",&amp;n); for(int i=0;i&lt;n;i++){ scanf("%d",&amp;a.

qq_61386381的博客 782

C++中位运算

简介 1 位逻辑运算符: &amp;(位 “与”) and ----------------- 2个都为1 才是1-----------0^0 = 0 , 0^1 = 0, 1^0 = 0 1^1= 1 ^(位 “异或”) ---------------------相同为0,不同为1--------0^0 = 0 , 1^1 = 0, 1...

anqiu4023的博客 405

C++信奥位运算

位运算虽然看起来像天书,但只要记住“0和1的游戏”,多画图模拟几次,你就会发现它比普通的加减法还要有趣!光看不练假把式。4 道题目,从基础计算到逻辑推理,难度循序渐进。建议拿出一张纸和一支笔,先把二进制写下来再算哦!

pxklove1214的博客 226

C++位运算

C++位运算 总结一下C++中位运算的用法。 &amp;amp;(与运算) 举例 11&amp;amp;3 = 3 00001011 &amp;amp; 00000011 = 00000011 = 3 常用例子 我们判断是否被2整除,一般写成if(n%2==0),使用位运算符也可写作if(n&amp;amp;1==0) |(或运算) 举例 11|3 = 11 0000...

Summit的专栏 509

【C++算法/学习】:位运算详解,看这篇就够了

✨🌏📃:在计算机内部,数是以「二进制(Binary)」的形式来进行存储。位运算就是直接对数的二进制进行计算操作,在程序中使用位运算进行操作,会大大提高程序的性能。:由 0 和 1 两个数码来表示的数。二进制数中每一个 0 或每一个 1 都称为一个「位(Bit)」。1. 位运算的运算符2. 位运算的性质。

island1314的博客 9114

C++位运算实战指南:从核心原理到高性能应用

位运算作为计算机底层的基本操作,直接对整数的二进制位进行操作,是实现极致性能优化的关键技术。其核心原理在于利用CPU的位级指令,通过按位与(&)、或(|)、异或(^)、取反(~)及移位(<<, >>)等操作,实现对数据的精细控制。这项技术的核心价值在于能以接近零成本的方式,大幅提升内存利用率和计算效率,是连接高级逻辑与底层硬件性能的关键桥梁。在应用场景上,位运算广泛应用于标志位管理、状态压缩、网络协议解析、图形处理及嵌入式系统等对性能要求苛刻的领域。本文以C++为例,深入解析位运算的实战技巧与常见陷阱,例如

diaohuyi6830的博客 511
上一篇: Hadoop学习笔记---MapReduce
下一篇: 【算法-排序之二】快速排序
小IT一枚
博客等级 码龄18年 5粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值