位运算---直接操作--节约内存??

2024-02-07 11:38

本文主要是介绍位运算---直接操作--节约内存??,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

位运算主要是直接操控二进制时使用 ,主要目的是节约内存,使你的程序速度更快,还有就是对内存要求苛刻的地方使用,以下是一牛人总结的方法,分享一下:位运算应用口诀
清零取反要用与,某位置一可用或
若要取反和交换,轻轻松松用异或移位运算
要点 1 它们都是双目运算符,两个运算分量都是整形,结果也是整形。2 " < < " 左移:右边空出的位上补0,左边的位将从字头挤掉,其值相当于乘2。3 " > > " 右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统。4 " > > > " 运算符,右边的位被挤掉,对于左边移出的空位一概补上0。位运算符的应用 (源操作数s 掩码mask)
(1) 按位与-- & 
1 清零特定位 (mask中特定位置0,其它位为1,s=s& mask)
2 取某数中指定位 (mask中特定位置1,其它位为0,s=s& mask)
(2) 按位或-- |常用来将源操作数某些位置1,其它位不变。 (mask中特定位置1,其它位为0 s=s|mask)
(3) 位异或-- ^
1 使特定位的值取反 (mask中特定位置1,其它位为0 s=s^mask)
2 不引入第三变量,交换两个变量的值 (设 a=a1,b=b1)目 标                    操 作                          操作后状态
a=a1^b1                a=a^b                          a=a1^b1,b=b1
b=a1^b1^b1          b=a^b                          a=a1^b1,b=a1
a=b1^a1^a1          a=a^b                          a=b1,b=a1二进制补码运算公式:
-x = ~x + 1 = ~(x-1)
~x = -x-1
-(~x) = x+1
~(-x) = x-1
x+y = x - ~y - 1 = (x|y)+(x& y)
x-y = x + ~y + 1 = (x|~y)-(~x& y)
x^y = (x|y)-(x& y)
x|y = (x& ~y)+y
x& y = (~x|y)-~x
x==y:      ~(x-y|y-x)
x!=y:      x-y|y-x
x< y:      (x-y)^((x^y)& ((x-y)^x))
x< =y:      (x|~y)& ((x^y)|~(y-x))
x< y:      (~x& y)|((~x|y)& (x-y))//无符号x,y比较
x< =y:      (~x|y)& ((x^y)|~(y-x))//无符号x,y比较 
应用举例 
(1) 判断int型变量a是奇数还是偶数                      
a& 1    = 0 偶数a& 1 =    1 奇数 
(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a> > k& 1 
(3) 将int型变量a的第k位清0,即a=a& ~(1< < k) 
(4) 将int型变量a的第k位置1, 即a=a|(1< < k) 
(5) int型变量循环左移k次,即a=a< < k|a> > 16-k    (设sizeof(int)=16) 
(6) int型变量a循环右移k次,即a=a> > k|a< < 16-k    (设sizeof(int)=16) 
(7)整数的平均值
对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:
int average(int x, int y)    //返回X,Y 的平均值
{       return (x& y)+((x^y)> > 1); 
} 
(8)判断一个整数是不是2的幂,对于一个数 x > = 0,判断他是不是2的幂
boolean power2(int x)
{ return ((x& (x-1))==0)& & (x!=0);
} 
(9)不用temp交换两个整数
void swap(int x , int y)
{ x ^= y; y ^= x; x ^= y; 
} 
(10)计算绝对值
int abs( int x )
{ 
int y ; 
y = x > > 31 ; 
return (x^y)-y ;               //or: (x+y)^y
} 
(11)取模运算转化成位运算 (在不产生溢出的情况下)a % (2^n) 等价于 a & (2^n - 1) 
(12)乘法运算转化成位运算 (在不产生溢出的情况下)a * (2^n) 等价于 a< < n 
(13)除法运算转化成位运算 (在不产生溢出的情况下)a / (2^n) 等价于 a> > n例: 12/8 == 12> > 3 
(14) a % 2 等价于 a & 1              
(15) if (x == a) x= b; else x= a; 等价于 x= a ^ b ^ x; 
(16) x 的 相反数 表示为 (~x+1)
清零取反要用与,某位置一可用或
若要取反和交换,轻轻松松用异或移位运算
要点 1 它们都是双目运算符,两个运算分量都是整形,结果也是整形。2 " < < " 左移:右边空出的位上补0,左边的位将从字头挤掉,其值相当于乘2。3 " > > " 右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统。4 " > > > " 运算符,右边的位被挤掉,对于左边移出的空位一概补上0。位运算符的应用 (源操作数s 掩码mask)
(1) 按位与-- & 
1 清零特定位 (mask中特定位置0,其它位为1,s=s& mask)
2 取某数中指定位 (mask中特定位置1,其它位为0,s=s& mask)
(2) 按位或-- |常用来将源操作数某些位置1,其它位不变。 (mask中特定位置1,其它位为0 s=s|mask)
(3) 位异或-- ^
1 使特定位的值取反 (mask中特定位置1,其它位为0 s=s^mask)
2 不引入第三变量,交换两个变量的值 (设 a=a1,b=b1)目 标                    操 作                          操作后状态
a=a1^b1                a=a^b                          a=a1^b1,b=b1
b=a1^b1^b1          b=a^b                          a=a1^b1,b=a1
a=b1^a1^a1          a=a^b                          a=b1,b=a1二进制补码运算公式:
-x = ~x + 1 = ~(x-1)
~x = -x-1
-(~x) = x+1
~(-x) = x-1
x+y = x - ~y - 1 = (x|y)+(x& y)
x-y = x + ~y + 1 = (x|~y)-(~x& y)
x^y = (x|y)-(x& y)
x|y = (x& ~y)+y
x& y = (~x|y)-~x
x==y:      ~(x-y|y-x)
x!=y:      x-y|y-x
x< y:      (x-y)^((x^y)& ((x-y)^x))
x< =y:      (x|~y)& ((x^y)|~(y-x))
x< y:      (~x& y)|((~x|y)& (x-y))//无符号x,y比较
x< =y:      (~x|y)& ((x^y)|~(y-x))//无符号x,y比较 
应用举例 
(1) 判断int型变量a是奇数还是偶数                      
a& 1    = 0 偶数a& 1 =    1 奇数 
(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a> > k& 1 
(3) 将int型变量a的第k位清0,即a=a& ~(1< < k) 
(4) 将int型变量a的第k位置1, 即a=a|(1< < k) 
(5) int型变量循环左移k次,即a=a< < k|a> > 16-k    (设sizeof(int)=16) 
(6) int型变量a循环右移k次,即a=a> > k|a< < 16-k    (设sizeof(int)=16) 
(7)整数的平均值
对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:
int average(int x, int y)    //返回X,Y 的平均值
{       return (x& y)+((x^y)> > 1); 
} 
(8)判断一个整数是不是2的幂,对于一个数 x > = 0,判断他是不是2的幂
boolean power2(int x)
{ return ((x& (x-1))==0)& & (x!=0);
} 
(9)不用temp交换两个整数
void swap(int x , int y)
{ x ^= y; y ^= x; x ^= y; 
} 
(10)计算绝对值
int abs( int x )
{ 
int y ; 
y = x > > 31 ; 
return (x^y)-y ;               //or: (x+y)^y
} 
(11)取模运算转化成位运算 (在不产生溢出的情况下)a % (2^n) 等价于 a & (2^n - 1) 
(12)乘法运算转化成位运算 (在不产生溢出的情况下)a * (2^n) 等价于 a< < n 
(13)除法运算转化成位运算 (在不产生溢出的情况下)a / (2^n) 等价于 a> > n例: 12/8 == 12> > 3 
(14) a % 2 等价于 a & 1              
(15) if (x == a) x= b; else x= a; 等价于 x= a ^ b ^ x; 
(16) x 的 相反数 表示为 (~x+1)

这篇关于位运算---直接操作--节约内存??的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/687613

相关文章

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.