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

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

相关文章

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

MySQL基本表查询操作汇总之单表查询+多表操作大全

《MySQL基本表查询操作汇总之单表查询+多表操作大全》本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟... 目录一、单表查询整合(一)通用模版展示(二)举例说明(三)注意事项(四)Mapper简单举例简单查询

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE

使用Python在PDF中绘制多种图形的操作示例

《使用Python在PDF中绘制多种图形的操作示例》在进行PDF自动化处理时,人们往往首先想到的是文本生成、图片嵌入或表格绘制等常规需求,然而在许多实际业务场景中,能够在PDF中灵活绘制图形同样至关重... 目录1. 环境准备2. 创建 PDF 文档与页面3. 在 PDF 中绘制不同类型的图形python

Java 操作 MinIO详细步骤

《Java操作MinIO详细步骤》本文详细介绍了如何使用Java操作MinIO,涵盖了从环境准备、核心API详解到实战场景的全过程,文章从基础的桶和对象操作开始,到大文件分片上传、预签名URL生成... 目录Java 操作 MinIO 全指南:从 API 详解到实战场景引言:为什么选择 MinIO?一、环境

Java JAR 启动内存参数配置指南(从基础设置到性能优化)

《JavaJAR启动内存参数配置指南(从基础设置到性能优化)》在启动Java可执行JAR文件时,合理配置JVM内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式... 目录一、核心内存参数详解1.1 堆内存配置1.2 元空间配置(MetASPace)1.3 线程栈配置1.

在DataGrip中操作MySQL完整流程步骤(从登录到数据查询)

《在DataGrip中操作MySQL完整流程步骤(从登录到数据查询)》DataGrip是JetBrains公司出品的一款现代化数据库管理工具,支持多种数据库系统,包括MySQL,:本文主要介绍在D... 目录前言一、登录 mysql 服务器1.1 打开 DataGrip 并添加数据源1.2 配置 MySQL

Go语言中如何进行数据库查询操作

《Go语言中如何进行数据库查询操作》在Go语言中,与数据库交互通常通过使用数据库驱动来实现,Go语言支持多种数据库,如MySQL、PostgreSQL、SQLite等,每种数据库都有其对应的官方或第三... 查询函数QueryRow和Query详细对比特性QueryRowQuery返回值数量1个:*sql

Python操作Excel的实用工具与库openpyxl/pandas的详细指南

《Python操作Excel的实用工具与库openpyxl/pandas的详细指南》在日常数据处理工作中,Excel是最常见的数据文件格式之一,本文将带你了解openpyxl和pandas的核心用法,... 目录一、openpyxl:原生 Excel 文件操作库1. 安装 openpyxl2. 创建 Exc