现在的位置: 首页 > 综合 > 正文

百纳笔试题 把ip字符串转换为32位二进制数

2013年11月07日 ⁄ 综合 ⁄ 共 1524字 ⁄ 字号 评论关闭
#include <iostream>
#include <string>
using namespace std;  
int ip[32]={0};//可以只写一个0,不然的话就是随见的如-3895567 之类的。
int * intToA(int a){ //把整型变成二进制数组。
	int *p =new int [8]; //这种写法不好,在哪new 的在哪释放。C++有智能指针,帮你释放内存。
	for(int j=0;j<8;j++){
		p[j]=0;
	}
	int k=7;
	while((a>>1)>0&&k>=0){//a>>1 替换了a/2。
		//p[k--]=a%2;//求余操作是很耗资源的如何避免。
		if ((a&1)==0) { //a&1 一定要()括号括起来。
			p[k]=0;
		}else{
			p[k]=1;
		}
		a=a>>1;//避免了a/=2;
		k--;
	}
	if ((a&1)==0) { //p[k]=a%2;的高效写法。这值得注意。
		p[k]=0;
	}else{
		p[k]=1;
	}
	return p;
}

int power(int n,int m){ //指数函数
	if (n==0) {
		return -1;
	}
	if (m==0) {
		return 1;
	}
	int result=1;
	for(int i=0;i<m;i++){
		result*=n;
	}
	return result;
}

string * ipSplit(string str){ //ip 特定的split 写法。
	string *str1=new string [4];
	int j=0;
	string temp="";
	for(int i=0;i<str.length();i++){
		if (str[i]=='.') {
			str1[j]=temp;
			j++;
			temp="";
		}else{
			temp+=str[i];
		}
	}
	str1[j]=temp;//这个必须有。
	return str1;
}

int main(int argc, char* argv[])    
 {
	string ipstr="192.168.0.1";
	string *strs =ipSplit(ipstr);
	int * ints =new int [4];
	int intLen=4;
	for(int i=0;i<intLen;i++){
		ints[i]=0;
		char *p=&strs[i][0];//怎么让一个char 型指向一个string型。就是让char 指针指向string 第一个字符 strs[i]是字符,第一个字符为strs[i][0];
		int k=0;
		int strsLen=strs[i].length();
		for(int j=strsLen-1;j>=0;j--){
			ints[i]+=(char((*p)-'0')*power(10,strsLen-1-k));//char型变成int 型 char((*p)-'0');
			k++;
			p++;
		}
	}
	
	int *p;
	for(int j=0;j<4;j++){//4个8为二进制数组转换为32位数组。
		p=intToA(ints[j]);
		for(int n=0;n<8;n++){
			ip[j*8+n]=p[n];
		}
	}

	cout<<"\nip[k]:"<<endl;
	for(int k=0;k<32;k++){
		if (k!=0&&k%8==0) {
			cout<<"   ";
		}
		cout<<ip[k]<<" ";
	}
	cout<<endl;
	return 0;    
 }

心得:
1.  其中一些高效写法值得注意。
2.  char 怎么指向string 类型。
3.  string 类型有length 函数 但char [] 字符数组没有strlen(const char[]) 只能用char [] 做参数,不能用string 作为strlen()参数。
4.  c++ 里没有数组没有任何函数。即不能.()的。
5.  多用英文在google 搜索问题答案。

抱歉!评论已关闭.