您的位置:首页 > 编程语言 > C语言/C++

C语言中的位操作

2015-07-05 18:13 393 查看

                                        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>


 
                                      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息