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>
相关文章推荐
- C语言学习笔记:14_内部函数和外部函数
- C++知识点随笔(一):this指针、拷贝构造函数、初始化列表
- 从C语言角度看OC编程里类、类对象
- C语言学习笔记:13_变量和函数的声明与定义
- C语言学习笔记:12_变量的存储方式和生存期
- 【C语言】printf函数和scanf函数典型例子
- C语言-共用体
- C++11初探
- 【C++】通用单链表
- c++ const 类型转化初始化
- 【C/C++学习笔记】memmove()、memcpy()、memccpy()、strcpy()函数整理
- C++一些注意事项
- C语言程序的gcc翻译步骤
- 让c++ 函数返回一个数组
- LRU Cache的C++实现
- 为什么C++编译器不能支持对模板的分离式编译
- Karatsuba 乘法
- c++11特性
- C++中引用(&)的用法和应用实例
- C语言 位移 速度 时间 Demo