C语言中的位操作
C语言中的位操作
作者:孤独草原狼
在计算机中数值都是以补码的形式存放和运算的,因此调试看内存的时候内存中看到的都是补码。
所以位操所的时候要先转化成补码才能运算。
原码和补码的相互转换:
在补码方案中: 1.最高位为1,表示负数;
2.正数的补码取反加1后是负数的补码,负数的补码取反加1后为其
绝对值。PS:这里所说的取反是对整个位取反,包括符号位。
几种位操作的用法如下:
#include <stdlib.h> //在补码方案中,正数的补码取反加1后 //为其对应的负数的补码,负数的补码取反加1后 //为其绝对值。PS:这里所说的取反是对整个位都 //取反,包括符号位。 #include <stdio.h> int main() { #if 0 /**< & 运算 (与) */ /**< 计算机中数字是以补码形式存放的,因此在内存中 a和b是以如下方式存储的(可以看内存) a:ff ff ff fb b:00 00 00 06 */ int a = -5, b = 6, c; c = a & b; printf("%d\n", c); return 0; #endif #if 0 /**< | 运算 (或)*/ /**< 同样使用上面的例子*/ int a = -5, b = 6, c; c = a | b; printf("%d\n", c); return 0; #endif // 1 #if 0 /**< ~ 运算 (非) */ /**< a:ff ff ff fe */ int a = -2, b; b = ~a; printf("%d\n", b); return 0; #endif // 1 #if 0 /**< ^ 运算 (异或) */ char a, b, c; a = 4, b = 3; c = a ^ b; printf("%d", c); return 0; #endif // 1 #if 1 /**< << 运算 (左移) */ /**< a: ff 左移一位后变成了 fe(补码), 转化成原码就是 1000 0010 == -2 ***左移运算比较简单,只是右边空出来的补0就好了。 */ char a, b; a = -1; b = a << 1; printf("%d\n", b); return 0; #endif // 1 #if 0 /**< >> 运算(右移) */ /**< ***对于有符号数用-1填补, 对于无符号数用0填补。 */ char a, b; a = -3, b = 1; printf("%d\n%d\n", a >> 1, b >> 1); return 0; #endif // 1 }<span style="color:#3333ff;"> </span>
posted on 2015-07-05 18:13 CodeNutter 阅读(502) 评论(0) 编辑 收藏 举报