整数数字字符串转化为相应的整数数值
Codeint atoi(char s[]){
int i, n;
n = 0;
for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
n = 10 * n + (s[i] - '0');
return n;
}
删除字符串s中出现的字符c
Codevoid squeeze(char s[], int c){
int i, j;
for (i = j = 0; s[i] != '\0'; ++i)
if (s[i] != c)
s[j++] = s[i];
s[i] = '\0';
}
&经常用来屏蔽某些二进制位
|经常用来设置某些二进制位为1
通常用~0来生成全1的掩码,不用考虑机器的字节大小
^经常用来设置某些二进制位为其反
说到^,想起了以前某次看到的,不引入新的变量,交换两整数
Codevoid intSwap(int *x, int *y){
*x = *x ^ *y;
*y = *x ^ *y;
*x = *x ^ *y;
}
返回x中从第p位开始的n位
Codeunsigned getbis(unsigned x, int p, int n){
return (x >> (p+1-n) & ~(~0 << n));
}
统计x中值为1的二进制位数
Codeint bitcount(unsigned x){
int b;
for (b = 0; x != 0; x >>= 1)
if (x & 01)
b++;
return b;
}
x &= (x - 1)可以删除x中最右边值为1的一个二进制位,改写bitcount,加快其执行速度
Codeint bitcount(unsigned x){
int b;
for (b = 0; x != 0; x &= (x-1))
++b;
return b;
}
更为通用的atoi函数
Code#include <ctype.h>
int atoi(char s[]){
int i, n, sign;
sign = 1;
for (i = 0; isspace(s[i]); ++i);
if (s[i] == '+' || s[i] == '-'){
sign = (s[i] == '+') ? 1 : -1;
++i;
}
for (n = 0; isdigit(s[i]); ++i)
n = 10 * n + (s[i] - '0');
return sign * n;
}
数字转换为字符串
Codevoid itoa(int n, char s[]){
int i, sign;
if ((sign = n) < 0)
n = -n;
i = 0;
do{
s[i++] = n%10 + '0';
}while ((n /= 10) > 0);
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}