大小端验证
代码如下:
#include <iostream>
#include <stdio.h>
#include <memory>
#include <string.h>
#include <string>
using namespace std;
void
hexdump(
void *pSrc,
int len
)
{
unsigned char *line;
int i;
int thisline;
int offset;
line = (unsigned char *)pSrc;
offset = 0;
while (offset < len)
{
printf("%04x ", offset);
thisline = len - offset;
if (thisline > 16)
{
thisline = 16;
}
for (i = 0; i < thisline; i++)
{
printf("%02x ", line[i]);
}
for (; i < 16; i++)
{
printf(" ");
}
for (i = 0; i < thisline; i++)
{
printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
}
printf("\n");
offset += thisline;
line += thisline;
}
}
void test02()
{
unsigned int u1 = 0;
unsigned int u2 = 4294967295;
unsigned int u3 = 2147483648;
unsigned int u4 = 2147483647;
int i1 = 5;
hexdump(&i1, sizeof(i1));
hexdump(&u1, sizeof(u1));
hexdump(&u2, sizeof(u2));
hexdump(&u3, sizeof(u3));
hexdump(&u4, sizeof(u4));
}
int main()
{
test02();
return 0;
}
hexdump
函数的作用是打印指定内存的十六进制形式内容,结果如下:
[root@VM-28-4-centos test]# ./test1
0000 05 00 00 00 ....
0000 00 00 00 00 ....
0000 ff ff ff ff ....
0000 00 00 00 80 ....
0000 ff ff ff 7f ....
可以看出 i1 为 5,我们实际书写的时候应该是 00 00 00 05, 但是内存打印的结果是颠倒的,数据低位存到地址低位,即小端字节序(机器字节序)。
C语言移位的问题
- 右移只对无符号数 (
unsigned
) 进行右移 - 移位数大于0,小于位数
使用 C++ 的 bitset 进行位操作
#include <iostream>
#include <bitset>
using namespace std;
void test01()
{
bitset<10> priv = 0x7F; // 当前拥有的权限值
bitset<10> P_BAKUP = (1 << 6);
bitset<10> P_ADMIN = (1 << 7);
cout << priv << endl;
cout << P_BAKUP << endl;
cout << P_ADMIN << endl;
if((priv & P_BAKUP) == P_BAKUP)
{
cout << "P_BAKUP" << endl;
}
if((priv & P_ADMIN) == P_ADMIN)
{
cout << "P_ADMIN" << endl;
}
}
int main()
{
test01();
return 0;
}
字符串的指针表示相关
void test05()
{
// 可以通过strArr[i] 修改值,但不能修改 strArr,数组名是
char strArr[11] = {"helloworld"};
// 不能通过pStr[i]方式修改值,因为 "helloworld"在常量区
char *pStr = "helloworld";
pStr = strArr; // OK
strArr = pStr; // ERROR,数组名不是可修改的左值
for(int i = 0; i != 10; ++i)
{
strArr[i] += 1;
cout << strArr[i];
}
cout << endl;
for(int i = 0; i != 10; ++i)
{
pStr[i] += 1;
cout << pStr[i];
}
cout << endl;
}
auto_ptr
很类似于 unique_ptr
所有权转移:若不小心把 auto_ptr
对象传递给另外 auto_ptr
,原来的指针就不再拥有这个对象了。 在拷贝/赋值过程中,会直接剥夺指针对原对象对内存的控制权,转交给新对象,然后再将原对象指针置为 nullptr
auto_ptr 在 C++17 已废弃
有了指针为什么还需要引用?
为了支持运算符重载
有了引用为什么还需要指针?
为了兼容C语言,
利用模板的编译期多态实现计算
使用模板类实现 1+2+3+….+ 100 :
template<int n>
struct Sum
{
enum Value {N = n + Sum<n-1>::N};
};
template<>
struct Sum<1>
{
enum Value {N = 1};
};
int main() {
cout << Sum<100>::N << endl;
return 0;
}
上述的代码在编译期就完成了运算,查看反汇编代码的时候可以看出直接得到了结果
全排列和STL的排列函数使用
要求:求得"123" 的全排列,即 123,132, 213, 231, 312 ,321
使用回溯手动实现的方法:
#include <iostream>
using namespace std;
// 全排列
void permutation(char *pStr, char *pBegin)
{
if(*pBegin == '\0')
{
cout << pStr << endl;
return;
}
for(char *p = pBegin; *p != '\0'; ++p)
{
swap(*pBegin, *p);
permutation(pStr, pBegin + 1);
swap(*pBegin, *p);
}
}
int main()
{
char test[] = "123";
permutation(test, test);
return 0;
}
使用STL提供的方法 next_permutation
,默认获取升序的下一个排列
char test[] = "132";
cout << endl;
do {
cout << test << endl;
}while(next_permutation(test, test + 3));
使用异或来交换数字要注意处理相同的数交换
若不对相同的数处理,则会导致相同的数交换结果为0,因为相同异或结果为0
void swap(int &a, int &b)
{
if(a == b) return;
a = a^b;
b = a^b;
a = a^b;
}
汇编相关
VC++传参是从右往左传参的
调用函数时,压入参数之后,接着是压入函数调用点的位置,从而函数退出时能回到调用点