C/C++ 各进制赋值、int/char转换、sscanf/sprintf、位操作运算
一、各进制赋值
1.十六进制赋值
int i=0x12AD;
int i=0X12AD;
int i=0x12Ad;
int i=0X12Ad;
//以上都是十六进制,表示十进制173;
2.八进制赋值
int num=017;
//数字前面加0就是8进制,017表示十进制15,若写018则编译出错。(error C2041: 非法的数字“8”(用于基“8”))
二、int/char/string转换
1.char*/char[]转int:atoi()
char* a="154"; int i=atoi(a); //成功
char a[]="154"; int i=atoi(a); //成功
char* a="abc"; int i=atoi(a); //i=0,也没出错
2.int转char[](转char*老崩溃)
int n=154;
char p[10];
itoa(n,p,16); //非STL,vs里能用,一些在线oj不能用
//十六是进制,可以自己指定。结果:p=“9a”;
3.char*/char[]转string
char*/char[] p="dsdsdsd";
string str=p;//直接赋值就行
4.string转char*
string p="ewqewq";
const char* o=p.c_str();//必须得是const
5.string/int互转
通过char即可;
三、sscanf/sprintf(c语言)
scanf:把键盘输入的数据给指定变量;
printf:打印指定变量至屏幕;
sscanf:把某const char*的数据给指定char*变量;
sprintf:把数据输入到指定char*。
1.sscanf():int sscanf(const char *buffer, const char *format, [argument ]...);
e.g.char buf[512] ;
sscanf("123456 ", "%s", buf);
printf("%s\n", buf);
结果为:123456
e.g.sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
结果为:1234
2.sprintf():int sprintf(char *buffer, const char *format, [argument] … );
格式控制符的类型要和后面argument的类型一样。
sprintf(s, "%d", 123); //把整数123打印成一个字符串保存在s中,
sprintf(s, "%8x", 4567); //小写16进制,宽度占8个位置,右对齐
sprintf(buf, "fdsafsdf");
char a = 'a'; sprintf(buf, "The ASCII code of a is %d.", a);
四、位操作运算
位操作只能用于整形数据,对实类型进行位操作会被编译器报错。
1.&(与操作)
int i=100;(二进制1100100)
则i&1=0;//只是最后一位和1进行与运算,所以可以判断奇偶性;
2.^(异或,两者不同则为1)
void Swap(int &a, int &b)
{
if (a != b)
{
a ^= b;
b ^= a;
a ^= b;
}
} //交换两个数不用第3个变量
3.移位
e.g.int n=98;
n=n>>1;//n=49;
<<各二进位全部左移若干位,高位丢弃,低位补0
>>各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)