ToB企服应用市场:ToB评测及商务社交产业平台

标题: 聊聊位运算一些注意事项 [打印本页]

作者: 锦通    时间: 2024-9-19 11:58
标题: 聊聊位运算一些注意事项
目录

位运算


位运算和逻辑运算区别

位运算是一位对应一位的对所有位逐一进行运算(逐比特位进行运算).逻辑运算是以计算表达式的真假为主进行运算.

位运算的几点注意


异或的运算规则

0000 0000 ... 0111
printf("%d\n",4^3); //结果:7
  1. 2. 任何数据和0异或,结果都是它本身
  2. ```C
  3. printf("%d\n",1 ^ 0);  //结果:1
  4. printf("%d\n",6 ^ 0);  //结果:6
  5. printf("%d\n",7 ^ 0);  //结果:7
  6. printf("%d\n",-1 ^ 0); //结果:-1
复制代码

异或的经典问题:两数交换

问题:两个变量int a = 10; int b = 20;再不使用第三个变量的前提下,怎么讲两个数进行交换?
方法一:加减法
  1.     a = a + b;  // ①
  2.     b = a - b;  // ②
  3.     a = a - b;  // ③
复制代码
解析:
(在计算机运算中,运算过程可以当作第三个变量,只是这个过程必须赋值才有意义,我们可以计算出各种组合的值用来匹配和验证)
缺点: 加法大概会有比特位递增,如果发生溢出,则会发生截断,导致数据丢失.所以这种方法仅适用于一定范围的数据

方法二:异或法
  1.     a = a ^ b; //①
  2.     b = a ^ b; //②
  3.     a = a ^ b; //③
  4. 一次记住它: 等号左边是aba,右边全是a^b
复制代码
解析消消乐)
相对于加减法的优点: 异或不会进位,不会出现比特位递增、溢出的问题

位操作建议使用宏定义好后使用

[code]// 0|0 = 0 ; 0|1 = 1  //  规律:任何数或0结果都是它自己      //用途:// 1|0 = 1 ; 1|1 = 1  //  规律:任何数或1,结果都是被设置为1  //用途:特定 比特位 置1// 组适用途:让特定比特位置1,其他位不变// 0&0 = 0 ; 0&1 = 0; //  规律:任何书与0,结果都是被设置成0  //用途:特定比特位置0// 1&0 = 0 ; 1&1 = 1; //  规律:任何书与1,结果都是它自己     //用途:获取特定比特位的值// 组适用途:没有干扰地获取特定比特位的值//一般都是用1(000...1)比较方便,通过移动1的位置,加上差别的位运算符,能够实现差别的功能.#define SETBIT(x,n)  (x |= (1




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4