随笔分类 - 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. =(x|y)+(x&y)i. =2(x|y)-(x^y)j. x-y=x+~y+1k. =(x^y)-2(~x&y)l. =(x&~y)-(~x&y)m. =2(x&~y)-(x^y)n. x^y=(x|y)-(x&y)o. x&~y=(x|y)-yp.=x-(x&y)q. ~(x-
阅读全文
摘要:信息是以比特流的方式传输的,类似01000001。在传输过程中,有可能会发生错误,比如,我们存储了01000001,但是取出来却是01000000,即低位由0变成了1。为了检测到这种错误,我们可以通过“奇偶校验”来实现。假如,我们存储的数据是一个字节,8个比特位,那我们就可以计算每个字节比特位是1的个数,如果是偶数个1,那么,我们就把第九个位设为1,如果是奇数个1,那么就把第九个位设为0,这样连续9个字节比特位为1的位数肯定是奇数。这中方法叫做“奇校验”,“偶校验”和此类似。当然,在实际应用中,也可以把一个字节的前7位作为数据位,最后一个为作为校验位。1、奇偶校验的常规方法:unsigned.
阅读全文
摘要:1、使用加法与减法交换两数值: #define SWAP(a, b) ((&(a) == &(b)) || \ (((a) -= (b)), ((b) += (a)), ((a) = (b) - (a))))这种交换数值a与b的方法没有使用临时变量,初始化检测a,b,如果在同一内存区,则被忽略,当然这通常不会发生,(编译器会忽略,然而无论如何都是一种优化),假如可以确定溢出异常,于是传递无符号数异常就不会抛出。下面的逻辑“或”运算的方法在某些机器上可能要快一些,不要使用浮点型数字。2、使用逻辑“或”方法交换两数值: #define SWAP(a, b) (((a)...
阅读全文
摘要:unsigned int v; // 判断v是否为2的幂
bool f; // f为判断的结果 f = (v & (v - 1)) == 0; // 结果为0表示不是2 的幂 // 改变表示方法,可以使用下面的方法:
f = v && !(v & (v - 1));
阅读全文
摘要:不用选择分支找出指定两整数中的最大值与最小值:int x; int y; // 找出x与y的最大值与最小值
int r; // r保存结果 r = y ^ ((x ^ y) & -(x =y, 那么 -(x> (sizeof(int) * CHAR_BIT - 1))); // min(x, y)
r = x - ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1))); // max(x, y)注意到1989 ANSI C说明书没有指定有符号右移,所以上上述方法不稳定,如果抛出溢出异常,于是在做减法操作的时候
阅读全文
摘要:判断两整数是否异号:int x, y; //输入比较的两数 bool f = ((x ^ y) > sizeof(int) * CHAR_BIT - 1; r = (v + mask) ^ mask; 变式: r = (v ^ mask) - mask;
阅读全文
摘要:关于衡量计算操作的方法: 当为算法统计操作的数量的时候,所有的C运算符被认为是一样的操作。中间过程不被写入随机存储器(RAM)而不被计算,当然,这种操作数的计算方法,只是作为那些接近机器指令和CPU运行时间的服务。所有的操作被假设成花相同的运行时间,事实上是不正确的。有很多不同的因素决定一个系统能多快运行一段样例代码,例如:缓存大小,内存带宽,指令集合等等……。最后,建立一套标准才是衡量一种方法快过另一种方法的最好方法。判断一个整数的符号:int v; // v为我们要判断的整数
int sign; // 保存结果 sign = -(v > (sizeof(int) * CH...
阅读全文
摘要:1、使用下面的代码将最右边的1改变为0,假如没有1则结果为0(e.g.,01011000=>01010000): x & (x-1)此代码可以用来判断一个无符号的整数是否为2的幂,假如x & (x-1)==1,则x为2的幂,否则x不为2的幂2、相似地,下面的代码可以用来判断一个无符号的整数是否具备2n-1的格式(包括n=0、1) x & (x+1)3、下面的代码将隔离最右边的1,假如右边没有1则结果返回0 (e.g., 01011000 =>00001000): x & (-x)4、下面的代码将隔离最右边的0,假如右边没有0则结果返回0 (e.g.,
阅读全文
摘要:位操作允许程序员对单独的位进行操作,例如,早某些机器上,短整型占16位,位操作将每一位单独操作。位操作允许程序员设置、清除、测试与其他的操作,这些操作如下表:操作含义&按位与|按位或^按位异或~取反>右移这些操作用于整型或者字符型1、按位与(&)Bit1Bit2Bit1 & Bit2000010100111通常我们可把按位“与”操作 & 作为关闭某位(即将该位置0)的手段,例如我们想要关闭a数中的第3位,而又不影响其它位的现状,可以用一个数0xF7,即二进制数1111 0111去与a数作按位“与”运算: 0x88 1000 1000 a数& 0xF
阅读全文