【补码】
在vc++6.0中一个int类型的变量所能存储的数字的范围是多少
最小负数的二进制代码是多少
最大正数的二进制代码是多少
已知一个整数的二级制代码求出原始的数字
数字超过最大正数会怎样
原码
也叫 符号-绝对值码
最高位0表示正 1表示负,其余二进制位是该数字的绝对值的二进制位
原码简单易懂
加减运算复杂
存在加减乘除四种运算,增加了CPU的复杂度
零的表示不唯一
反码
反码运算不便,也没有在计算机中应用
移码
表示数值平移N位,N称为移码量
移码主要用于浮点数的阶码的存储
补码
已知十进制转二进制
求正整数转二进制
除2取余,直至商为零,余数倒序排序
求负整数转二进制
先求与该负数相对应的正整数的二进制代码,然后将
所有位取反,末尾加1,不够所属变量类型字节数的位数时,左边补1
举例:int -3
先求3的的二进制码为 011
取反为 100
末尾加1为 101
因为是整型变量为4个字节数,即4X8=32位,而上面只占了3位,所以左边需要补29个零
最终为:11111111111111111111111111111101
求零的二进制
全是零
已知二进制求十进制
如果首位是0,则表明是正整数,按普通方法来求
如果首位是1,则表明是负整数,将所有位取反,末尾加1,所得数字就是该负数的绝对值
如果全是零,则对应的十进制数字就是零
进制转化
进制即时逢几进一
比如,N进制就是逢N进一
计算机只识别二进制
而人们常用的习惯使用的是十进制
----------------------------------------
在数字后面加B表示二进制
O表示八进制
D表示十进制
H表示十六进制
【位运算符】
& 按位与
&& 逻辑与 也叫并且
&&与& 的含义完全不同
1&1 = 1
1&0 = 0
0&0 = 0
0&1 = 0
|
||逻辑或
| 按位或
1|1 = 1
1|0 = 1
0|0 = 0
0|1 = 1
~
按位取反
~i就是把i变量所有的二进制位取反
^
按位异或
相同为零,不同为1
1 ^ 0 = 1
0 ^ 1 = 1
1 ^ 1 = 0
0 ^ 0 = 0
<<
按位左移
i >> 3 表示把i的所有二进制位左移3位,右边补零
左移n位相当于乘以2的n次方
面试题:
A) i = i*8;
B) i = i << 3;
请问上述两个语句,哪个语句执行的速度快
答案:B快
因为如果是乘法,在计算机中运算的时候会需要调用到很多复杂的东西,
而位移却是不用,所以位移执行快。i << 3 = i * 2^3 (i乘以2的3次方)
>>
按位右移
i >> 3 表示把i的所有二进制位右移3位,左边一般是0,也可能根据最高位是1或者0
右移n位相当于除以2的n次方,前提是不能溢出,数据不能移的丢失了
面试题:
A) i = i/8;
B) i = i >> 3;
请问上述两个语句,哪个语句执行的速度快
答案:B快
位运算的现实意义:
通过位运算符我们可以对数据的操作精确到每一位
-------------------------------------------------------------
#include <stdio.h>
int main(void)
{
int i = 5;
int j = 7;
int k;
k = i & j; //表示按位与
printf("%d\n",k); //这里的结果是5
k = i && j; //K的值只能是1或者0,因为&&是个逻辑运算符,
//逻辑运算符的结果只能是真或假,真用1表示,假用0表示
printf("%d\n",k); //这里的结果是1
return 0;
}
解析:
5的二进制码为:0101
7的二进制码为:0111
两个二进制码进行与运算的结果为:0101
所以第一个printf的结果是5
----------------------------------------------------------------------------
#include <stdio.h>
int main(void)
{
int i = 3;
int j = 5;
int k;
k = i|j;
printf("%d\n",k);
k = ~i; //
printf("%d\n",k); //k的值为4
k = i << i;
printf("%d\n",k); //k的值为6
return 0;
}
3的二进制码为:0011
5的二进制码为:0101
两个二进制码进行或运算的结果为:0111 即为7
最终k的值为7
----------------------------------------------------------------
【NULL】
C语言中二进制全部为零的含义:
1.数值零
2.字符串结束标记符‘\0’
3.空指针NULL
NULL表示的是零,而这个零不代表数字零,而表示的是内存单元的编号零.
根据解码的不同而结果不同
计算机规定了,以零为编号的存储单元的内容不可读,不可写
--------------------------------------------------------
【链表】
算法:
通俗的定义:
解题的方法和步骤
狭义的定义:
对存储数据的操作
对不同的存储结果,要完成某一个功能所执行的操作是不一样的
比如:
要输出数组中所有的元素的操作和
要输出链表中所有的元素的操作肯定是不一样的
这说明:
算法是依附于存储结构的
不同的存储结构,所执行的算法是不一样的
广义的定义:
广义的算法也叫泛型
无论数据是如何存储的,对数据的操作都是一样的
至少可以通过两种结构来存储数据:
数组
缺点:
需要一个连续的很大的内存
插入和删除元素的效率很低
优点:
存取速度快
链表
专业术语;
首节点
存放第一个有效数据的节点
尾节点
存放最后一个有效数据的节点
头结点
头结点的数据类型和首节点的类型是一模一样的
头结点是首节点前面的那个节点
头结点并不存放有效数据
设置头结点的目的是为了方便对链表的操作
头指针
存放头结点地址的指针变量
确定一个链表需要一个参数
头指针
优点:
插入删除元素效率高
不需要一个连续的很大的内存
缺点:
查找某个位置的元素效率低
-----------------------------------------------------------------------------
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
struct Node
{
int data; //数据域
struct Node *pNext; //指针域
};
struct Node *create_list(void); //函数声明
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
struct Node
{
int data; //数据域
struct Node *pNext; //指针域
};
struct Node *create_list(void); //函数声明
void traverser_list(struct Node *);
int main(void)
{
struct Node *pHead = NULL;
pHead = create_list(); //创建一个非循环单链表,且将链表头结点地址赋给pHead
//然后主函数就可以通过pHead确定这个新建链表
traverser_list(pHead); //输出链表中的每个元素
return 0;
}
struct Node *create_list(void)
{
int len; //用来存放有效节点的个数
int i;
int val; //用来临时存放用户输入的节点的值
struct Node *pHead = (struct Node *)malloc(sizeof(struct Node));
if (NULL == pHead)
{
printf("分配失败,程序终止!\n");
exit(-1);
}
struct Node *pTail = pHead;
pTail->pNext = NULL; //等价于(*pTail).pNext
printf("请输入您需要生成的链表节点的个数:len = ");
scanf("%d",&len);
for(i=0;i<len;++i)
{
printf("请输入第%d个节点的值:",i+1);
scanf("%d",&val);
struct Node *pNew = (struct Node *)malloc(sizeof(struct Node));
if(NULL == pNew)
{
printf("分配失败,程序终止!\n");
exit(-1);
}
pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
return pHead;
}
bool empty_list(struct Node *pHead)
{
if(pHead->pNext == NULL;)
return true;
else
return false;
}
void traverser_list(struct Node *pHead)
{
struct Node *p = pHead->pNext;
while(NULL != p)
{
printf("%d\n",p->data);
p = p->pNext;
}
return;
}
-------------------------------------------------------------------------------------
10.补码+位运算符+NULL+链表
最新推荐文章于 2024-01-09 10:06:41 发布