1、十进制转二进制字符串的思路
1)把十进数除以2,记下余数(余数保存在字符串中),现用商除以2,再记下余数,如此循环,直到商为0。
2)把保存余数的字符串反过来,就是结果。
2、二进制字符串转十进制的思路
把二进制字符串从最高位(左边第一位)开始用商乘以2再加余数(该位的数字),如此循环,左边第一位的商肯定是0。
#inciude<stdio.h>
#define BASE_SIZE32
#define HEX 16
int binary_conversion(int value_t,int target_system_t){
int value=value_t;
int target_system=target_system_t;
int target_value[BASE_SIZE]={0};
int target_value_i=0;
while(value){
target_value[target_value_i]=value%target_system;
value=value/target_system;
target_value_i++;}
if(target_system==HEX){
for( ;target_value_i>=0;target_value_i--){
printf("%x",target_value[target_value_i]);
}
}
else {
for( ;target_value_i>=0;target_value_i--){
printf("%d",target_value[target_value_i]);
}
}
return 0;
}
int main(void){
int input_value=0;
int target_system=0;
scanf("%d,%d",&input_value,&target_system);
binary_conversion(input_value,input_system);
return 0;
3.位字段
位字段(bit filed)是C语言中一种存储结构,不同于一般结构体的是它在定义成员的时候需要指定成员所占的位数。位字段是一个signed int或unsigned int类型变量中一组相邻的位。位字段通过一个结构声明来建立,该结构声明为每个字段提供标签,并确定该字段的宽度。例如,下面的声明建立了4个1位的字段:
struct {
unsigned autfd : 1;
unsigned bldfc : 1;
unsigned undln : 1;
unsigned itals : 1;
} prnt;
根据该声明,prnt包含了4个1位的字段。现在,可以通过普通的结构成员运算符(.)单独给这些字段赋值:
prnt.itals=1;
prnt.undln=0;
prnt.bldfc=1;
prnt.autfd=0;
prnt的大小为4个字节(unsigned int 或 signed int),通过prnt的结构成员可以设置和访问某些bit位的值。
带有位字段的结构提供了一种记录设置的方便途径。许多设置就是简单的二进制一。例如,开或关、真或假。如果只需要使用1位,就不需要使用整个变量。内含位字段的结构允许在一个存储单元中存储多个设置。
有时,某些设置也有多个选择,因此需要多位来表示。例如,可以使用如下代码:
struct{
unsigned code1 : 2;
unsigned code2 : 2;
unsigned code3 : 8;
}prcode;
这里创建了两个2位的字段和一个8位的字段,可以这样赋值:
prcode.code1=0;
prcode.code2=3;
prcode.code3=102;
但是要确保赋的值不超出字段可容纳的范围
一个字段可以对应于多个比特位,且当使用结构字段赋值在可容纳的范围之内时,变量可以记录正确的值。
如果声明的总位数超过一个unsigned int类型的大小(4 bytes),结果是会用到下一个unsigned int类型的存储位置。一个字段不允许跨越两个unsigned int之间的边界。编译器会自动移动跨界的字段,保持unsigned int的边界对齐。一旦发生这种情况,第1个unsigned int中会留下一个未命名的“洞”。
4位移
移位运算用来将整型或字符型数据作为二进位信息串作整体移动。有两个运算符:
<< (左移) 和 >> (右移)
移位运算是双目运算,有两个运算分量,左分量为移位数据对象,右分量的值为移位位数。移位运算将左运算分量视作由二进位组成的位串信息,对其作向左或向右移位,得到新的位串信息。
移位运算符的优先级低于算术运算符,高于关系运算符,它们的结合方向是自左至右。
右移>>
i>>j
i中所有的位向右移j位
所有小于int的类型,移位以int的形式来做,结果为int
对于unsigned的类型,左边填入0
对于signed的类型,左边填入原来最高位(保持符号不变)
x>>=1 等价于 x /=2
x>>=n 等价于 x/=2^n
左移<<
i<<j
i中所有的位向左移动j个位置,而右边填入0
所以小于int的类型,移位以int的方式来做,结果是int
x<<=1 等价 于 x*=2
x<<=n 等价于 x*=2^n