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

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

相关文章

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Java Multimap实现类与操作的具体示例

《JavaMultimap实现类与操作的具体示例》Multimap出现在Google的Guava库中,它为Java提供了更加灵活的集合操作,:本文主要介绍JavaMultimap实现类与操作的... 目录一、Multimap 概述Multimap 主要特点:二、Multimap 实现类1. ListMult

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

python操作redis基础

《python操作redis基础》Redis(RemoteDictionaryServer)是一个开源的、基于内存的键值对(Key-Value)存储系统,它通常用作数据库、缓存和消息代理,这篇文章... 目录1. Redis 简介2. 前提条件3. 安装 python Redis 客户端库4. 连接到 Re