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 阅读(510) 评论(0) 收藏 举报
浙公网安备 33010602011771号