
C语言位操作艺术
文章平均质量分 52
xueda120
程序员
展开
-
C语言位操作--不用中间变量交换两数值
1、使用加法与减法交换两数值: #define SWAP(a, b) ((&(a) == &(b)) || \ (((a) -= (b)), ((b) += (a)), ((a) = (b) - (a))))这种交换数值a与b的方法没有使用临时变量,初始化检测a,b,如果在同一内存区,则被忽略,当然这通常不会发生,(编译器会忽略,然而无论如何都是一种优化),原创 2013-07-12 23:17:57 · 958 阅读 · 0 评论 -
C语言位操作--判断整数是否为2的幂
unsigned int v; // 判断v是否为2的幂bool f; // f为判断的结果f = (v & (v - 1)) == 0; // 结果为0表示不是2 的幂// 改变表示方法,可以使用下面的方法:f = v && !(v & (v - 1));原创 2013-07-12 21:00:22 · 1145 阅读 · 0 评论 -
C语言位操作--判断两整数是否异号
判断两整数是否异号:int x, y; //输入比较的两数bool f = ((x ^ y) 说明:当x、y异号,x与y的最高位分别为0和1,取"^"后为1,结果为负数不用选择语句得到指定整数的绝对值:int v; // 需要得到整数v的绝对值unsigned int r; // r保存结果int const mask原创 2013-07-12 20:31:00 · 3838 阅读 · 1 评论 -
C语言位操作--奇偶校验算法
信息是以比特流的方式传输的,类似01000001。在传输过程中,有可能会发生错误,比如,我们存储了01000001,但是取出来却是01000000,即低位由0变成了1。为了检测到这种错误,我们可以通过“奇偶校验”来实现。假如,我们存储的数据是一个字节,8个比特位,那我们就可以计算每个字节比特位是1的个数,如果是偶数个1,那么,我们就把第九个位设为1,如果是奇数个1,那么就把第九个位设为0,这样连续原创 2013-07-12 23:33:27 · 12451 阅读 · 1 评论 -
C语言位操作--两整数中的最大值与最小值
不用选择分支找出指定两整数中的最大值与最小值:int x; int y; // 找出x与y的最大值与最小值int r; // r保存结果r = y ^ ((x ^ y) & -(x 在一些很少的机器上,分支比较很耗资源,而且没有条件移动指令存在,以上的实现可能比传统的方法: r = (x 要快。即使比后者多执行两步指令。(通常,前面的方法要快)它的工作原理如下:原创 2013-07-12 20:56:40 · 1626 阅读 · 0 评论 -
C语言位操作--判断整数的符号
关于衡量计算操作的方法: 当为算法统计操作的数量的时候,所有的C运算符被认为是一样的操作。中间过程不被写入随机存储器(RAM)而不被计算,当然,这种操作数的计算方法,只是作为那些接近机器指令和CPU运行时间的服务。所有的操作被假设成花相同的运行时间,事实上是不正确的。有很多不同的因素决定一个系统能多快运行一段样例代码,例如:缓存大小,内存带宽,指令集合等等……。最后,建立一套标准才是衡量一原创 2013-07-12 20:26:40 · 1752 阅读 · 0 评论 -
C语言位操作--逻辑运算符组合
假设读者熟悉普通代数与布尔代数,下面是部分常见的涉及到加法、减法与逻辑运算符的组合:a. -x=~x+1b. =~(x-1)c. ~x=-x-1d. -~x=x+1e. ~-x=x-1f. x+y=x-~y-1g. =(x^y)+2(x&y)h.原创 2013-07-12 23:57:50 · 824 阅读 · 0 评论