1.不使用临时变量,交换两个数据
void(int *x,int *y)
{
*x=*x^*y;
*y=*x^*y;
*x=*x^*y;
}
2.指针(例如,一个被声明为类型“char*”的变量)使用机器的全子长。
例如:
void PointerInfo(char *p)
{
cout << sizeof(p) << endl;
}
using namespace std;
int main()
{
char x = 0;
PointerInfo(&x);
return 0;
}
这里输出是 4;
3.表达式~0讲生成对于一个全1的掩码,不管机器的字大小是多少,尽管对于一个32位机器同样的掩码可以写成0xFFFFFFFF,但是这样的代码是不可移植的。
4.有一个相应的右移运算x>>k,但是它的行为有点微妙,一般而言,鸡翅支持两种形式的右移:逻辑的和算数的,逻辑右移在左端补k个0,算术右移是在左端补k个最高有效位的拷贝。这种做法看上去可能有点奇特,但是我们会发现它对有符号整数数据的运算非常有用。
C标准并没有明确定义应该使用哪种类型的右移。对于无符号数据(也就是,一限定词 unsigned声明的整型对象),右移必须是逻辑的,而对于有符号数据(默认的),算术的或者逻辑的右移都可以。不幸地,这就意味着任何假设一种或者另一种右移形式的代码都潜在的会遇到可移植性的问题。然而,实际上,几乎所有的编译器都对有符号使用算术右移。
例如:
在十进制转换为二进制的时候,可以使用位移操作:
string MySystem::DecToBinary(int n)
{
//因为要处理负数的情况,且负数和正数的不对称性,所以需要将其转换为大数
//第一种,我们可以使用常规的方法来求解,即取2的模数,然后除以2.....如此循环,得到结果
long long Temp = static_cast(n);
if (Temp<0)
{
//处理补码的情况
Temp = UINT_MAX + n + 1;
}
string Result("");
while (Temp)
{
Result += (Temp % 2 + '0');
Temp /= 2;
}
//翻转字符串
int i = 0;
int j = Result.size() - 1;
while (i(n);
// if (Temp<0)
// {
// //处理补码的情况
// Temp = UINT_MAX + n + 1;
// }
// string Result("");
// while (Temp)
// {
// if (Temp&0x01)
// {
// Result += '1';
// }
// else
// {
// Result += '0';
// }
// Temp >>= 1;
// }
// //翻转字符串
// int i = 0;
// int j = Result.size() - 1;
// while (i
<span style="white-space:pre"> </span>string Result("");
while (Temp)
{
if (Temp&0x01)
{
Result += '1';
}
else
{
Result += '0';
}
Temp >>= 1;
}
如果 temp是负数的话,(-1),那么这个将陷入的死循环。