A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 18518902001 中级黑马   /  2015-8-16 13:05  /  547 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//---------------------------原码,反码,补码
数据在计算机中的存储方法:
数据在计算机内部是以补码的形式储存的
数据分为有符号数和无符号数
无符号数都为正数,由十进制直接转换到二进制直接存储(其实也是该十进制的补码)即可。
有符号数用在计算机内部是以补码的形式储存的。
( 正数的最高位是符号位0,负数的最高位是 符号位1。
对于正数:反码==补码==原码。 对于负数:反码==除符号位以外的各位取反。补码=反码+1)
以二进制的补码存储
正数:三码合一
负数:反码 = 源码取反,补码 = 反码+1, 或者 补码 = 源码取反 + 1,
前提都是符号位不变
正数的首位地址为0,其原码是由十进制数转换到的二进制数字
负数的首位地址为1,其原码后面的位也为10进制数转换过去的二进制数字,都是用补码方式表示 有符号数的。
1)原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值.
一个数的绝对值的二进制表示
正数:最高位改0
负数:最高位改1
2)反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
3)补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
总结
正数三码合一:
负数:
原码负号位不变,其余个位取反
补码:
原码符号位不变,其余各位取饭+1,反码+1
//------------------------------------------------------------------------
1+(-1) = 0
00000000 00000000 00000000 00000001     1 源码
00000000 00000000 00000000 00000001     1 反码
00000000 00000000 00000000 00000001     1 补码

10000000 00000000000000000000000001     -1源码
11111111 11111111 11111111 11111110     -1反码
11111111 11111111 11111111 11111111    - 1补码
00000000 00000000 00000000 00000001   1的补码
11111111 11111111 11111111 11111111   + -1的补码
----------------------------------------------------------------------------
00000000 00000000 00000000 00000000        0
1(源码) + (-1)(源码) = -2
1(反码) + (-1)(反码) = -0
1(补码) + (-1)(补码) = 0
//-----------------------位运算
位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。
C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的 char,short,int与long类型。
1)& 按位与   口诀: 同1为1,有0为0
只有对应的两个二进位均为1时,结果位才为1,否则为0
2) | 按位或    口诀:有1则1
只要对应的二个二进位有一个为1时,结果位就为1,否则为0
3) ^ 按位异或  口诀:同0非1
当对应的二进位相异(不相同)时,结果为1,否则为0
4)~ 取反
各二进位进行取反(0变1,1变0)
以上都是在二进制进行运算
1)<<  左移
1、各二进位全部左移n位,高位丢弃,低位补0
1)左移可能会改变一个数的正负性
2)左移1位相当于*2^n
举例:快速计算一个数乘以2的n次方
(8<<3 等同于8*2^3)
  
2)>> 右移
各二进位全部右移n位,保持符号位不变
x >> n
x的所有二进制位向右移动n位,移出的位删掉,移进的位补符号位
1、右移不会改变一个数的符号
2  右移 n 位就相当于/2^n
用途:快速计算一个数除以2的n次方 (8>>3 等同于8/2^3)
技巧:
1)任何数和1进行&操作,得到这个数的最低位
2)想把某一位置0,就让它某一位置与0进行&运算
理解:
1)编程实现10进制转2进制
// 每次取 一个数的最后一个二进制位  >>(31-i)
// 任何一个数和1进行&(按位与)得到任何一个数的二进制的最后一位
第一次取出符号位

a&1  -->  1  奇数
     -->  0  偶数
1)数学方法:
a = b - a;
b = b - a;
a = b + a;
2)
int temp = 0,a = 1,b = -1;
temp = a;
a = b;
b = temp;
  
3)实现两个变量值交换
a = a^b;
b = a^b; -->  a^b^b; --> a
a = a^b;-->   a^b^a; --> b
  1001   a
^ 1101   b
----------------------
  0100
^ 1101   b
-----------------------
  1001
//----------------变量地址获取及存储原理
%p 输出一个地址
定义在函数中变量我们称为局部变量,
先分配字节地址大内存,然后分配字节地址小的内存
变量的首地址,是变量所占存储空间字节地址最小的那个地址
低位保存在低地址字节上,高位保存在高地址字节上
----------------------------------------------  华丽分割线   ---------------------------------------------
持续更新 敬请期待

36a66d6c10e497c7780aacc469c77d65.jpg (65.67 KB, 下载次数: 23)

当机会来临时 你已经准备好了

当机会来临时 你已经准备好了

2 个回复

倒序浏览
支持,赞
回复 使用道具 举报
总结的不错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马