C语言位操作运算详解(共7页).docx

上传人:飞****2 文档编号:14460279 上传时间:2022-05-04 格式:DOCX 页数:7 大小:26.26KB
返回 下载 相关 举报
C语言位操作运算详解(共7页).docx_第1页
第1页 / 共7页
C语言位操作运算详解(共7页).docx_第2页
第2页 / 共7页
点击查看更多>>
资源描述

《C语言位操作运算详解(共7页).docx》由会员分享,可在线阅读,更多相关《C语言位操作运算详解(共7页).docx(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上位运算程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作位操作的优势 位运算是一种底层的运算,往往比我们普通的运算要快上许多许多 位运算是最高效而且占用内存最少的算法操作,执行效率非常高 位运算操作的是二进制数,会拥有一些二进制的特性,在实际问题可以方便运用 位运算只需较低的空间需求 位运算使用能使程序变得更加简洁和优美 位运算可以表示一些状态集合运算符号下面的a和b都是整数类型,则:含义C语言按位与a & b按位或a | b按位异或a b按位取反a左移a b无符号右移优先级C语言中位运算符之间,按优先级顺序排列为优先

2、级符号123&45|6&=、=、|=、=概念简介以及技巧本文会以C语言的交互环境来做代码演示常见的二进制位的变换操作and运算 & 判断奇偶数对于除0以外的任意数x,使用x&1=1作为逻辑判断即可if (x&1=1) 判断某个二进制位是否为1比如第7位, 0x40转到二进制是0100 0000,代表第7位是1.if (n&0x40) /TODO:添加你要处理的代码 字节读取(x 0) & 0xff/* 获取第0个字节 */(x 8) & 0xff/* 获取第1个字节 */(x 16) & 0xff/* 获取第2个字节 */(x 24) & 0xff/* 获取第3个字节 */ 判断一个数是不是

3、22 的指数bool isPowerOfTwo(int n) if (n = 0) return false; return (n & (n - 1) = 0; 取余/得到余数int Yu(int num,int n)int i = 1 n;return num&(i-1); 指定二进制位数截取比如说16位二进制数A:1001 1001 1001 1000,如果来你想获A的哪一位的值,就把数字B:0000 0000 0000 0000的那一位设置为1.比如说我想获得A的第三位就把B的第三位数字设置为1,则B为0000 0000 0000 0100,设置完之后再把A、B求与, 其结果若为0,说明

4、A的第三位为0,其结果为1,说明A的第三位为1.同理:若要获得A的第五位,就把B设置为0000 0000 0001 0000,之后再求与。通常在我们的程序中,数字B被称为掩码,其含义是专门用来测试某一位是否为0的数值。 统计二进制中 1 的个数利用x=x&(x-1),会将x用二进制表示时最右边的一个1变为0,因为x-1会将该位变为0.int Count(int x) int sum=0; while(x) sum+; x=x&(x-1); return sum;or操作 生成组合编码,进行状态压缩当把二进制当作集合使用时,可以用or操作来增加元素。合并编码 在对字节码进行加密时,加密后的两段b

5、it需要重新合并成一个字节,这时就需要使用or操作。 求一个数的二进制表达中0的个数int Grial(int x) int count = 0; while (x + 1) count+; x |= (x + 1); return count;xor操作 两个整数交换变量名void swap(int &a, int &b) a = b; b = a; a = b; 判断两个数是否异号int x = -1, y = 2;bool f = (x y) 0); / trueint x = 3, y = 2;bool f = (x y) 0); / false 数据加密将需要加密的内容看做A,密钥看

6、做B,A B=加密后的内容C。而解密时只需要将C 密钥B=原内容A。如果没有密钥,就不能解密!#include #include #include #define KEY 0x86int main() char p_data16 = Hello World!; char Encrypt16=0,Decode16=0; int i; for(i = 0; i strlen(p_data); i+) Encrypti = p_datai KEY; for(i = 0; i strlen(Encrypt); i+) Decodei = Encrypti KEY; printf(Initial dat

7、e: %sn,p_data); printf(Encrypt date: %sn,Encrypt); printf(Decode date: %sn,Decode); return 0; 数字判重利用了二进制数的性质:xyy = x。我们可见,当同一个数累计进行两次xor操作,相当于自行抵销了,剩下的就是不重复的数 找出没有重复的数int find(int arr) int tmp = arr0; for(int i = 1;i 31 取得n的符号2. 若n为正数,n31等于03. 若n为负数,n31等于-14. 若n为正数 n0=0,数不变5. 若n为负数,有n-1 需要计算n和-1的补码,

8、然后进行异或运算,结果n变符号并且为n的绝对值减1,再减去-1就是绝对值int abs(int n) return (n (n 31) - (n 31);也可以这样使用int abs(int n) int i = n 31; return i = 0 ? n : (n + 1); 从低位到高位.将n的第m位置1将1左移m-1位找到第m位,得到000.1.000, n在和这个数做或运算int setBitToOne(int n, int m) return n | (1 (m-1);同理从低位到高位,将n的第m位置0,代码如下int setBitToZero(int n, int m) retu

9、rn n & (1 (m-1);shl操作 & shr操作 求2的N次方 1 8) | (a 1) | (a & 0x5555) 2) | (a & 0x3333) 4) | (a & 0x0F0F) 8) | (a & 0x00FF) 8); 获得int型最大最小值int getMaxInt() return (1 31) - 1;/, 由于优先级关系,括号不可省略int getMinInt() return 1 1; return sum; 找出不大于N的最大的2的幂指数int findN(int n) n |= n 1; n |= n 2; n |= n 4; n |= n 8 / 整型

10、一般是 32 位,上面我是假设 8 位。 return (n + 1) 1; 二分查找32位整数的前导0个数int nlz(unsigned x) int n; if (x = 0) return(32); n = 1; if (x 16) = 0) n = n +16; x = x 24) = 0) n = n + 8; x = x 28) = 0) n = n + 4; x = x 30) = 0) n = n + 2; x = x 31); return n; 位图的操作将 x 的第 n 位置1,可以通过x |= (x n)来实现set_bit(char x, int n);将 x 的第 n 位清0,可以通过x &= (1 n) & 1来实现get_bit(char x, int n);如下:#define clr_bit(x, n) ( (x) &= (1 (n) )#define set_bit(x, n) ( (x) |= (1 (n) & 1 )专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁