今天因为看了讨论班的网格生成太占时间了,必须分配好。只写了一段,必须有所改变。
18.11.03-04
这两天时间没有分配好,还需做好调整,并且把这两门数据课当成有期末考试的形式去对待。
昨天看数据结构,有一个将字面值转化成二进制后输出1的个数的小算法。然后今天学习了位运算符。总结如下:
- 首先介绍位运算符的一些类型
位运算符(左结合律) | ||
---|---|---|
运算符 | 功能 | 用法 |
~ | 位求反 | ~ t |
<< | 左移 | t << 8 (向左移8位) |
>> | 右移 | t >> 8 (向右移8位) |
& | 位与 | t & q (都为1,则取1,否则为0) |
^ | 位异或 | t ^ q (只有一个为1,则取1) |
| | 位或 | t | q(有为1,就取1) |
首先得定义字面值得数字类型;char 占 8位,int 占 32 位,为了避免少位置而报错,可以选择long int ;long long int ;
将整型字面值写成十进制,八进制,十六进制。
20 /* 十进制 */ 024 /* 八进制 */ (八进制的要求是以0开头的整数)
八进制的一个要求是你不能写成 08,因为第一个8会逢8进1
0x24 /* 十六进制 */ (十六进制的要求是以0x开头的整数) 0x16 就没问题,因为会自动当成1*16^1+6*16^0
优先级
比算术运算符低,比关系运算符,赋值运算符和条件运算符高;
cout << 10+42 (正确)
cout << (10<42) (正确)
cout << 10 < 42 (错误) 试图比较cout 和42 ,相当于把10这个值赋值给cout
//检查整数字面值转化成二进制的含1的个数
//将整数字面值打印成二进制
using namespace std;
int countones(unsigned long n);
int print_binary(unsigned long N);
int num = 0;
int c[100];//用于储存二进制的数值
int main()
{
int a=countones(0x24);
cout << a << endl;
int binary_num=print_binary(0x24);
while(binary_num>0)
{
cout << c[--binary_num];
}
cout << endl;
}
int countones(unsigned long y)
{
int ones = 0;
while(y > 0)
{
ones += (1 & y); //若为1,则还是1;否则为0,1 & y ---位与运算自动把十位制改为二进制
y >>= 1;//y每次向右移动一位
}
return ones;
}
int print_binary(unsigned long N)
{
for (int i = 0; N > 0; i++)
{
c[i] = N % 2;
N = N / 2;
num++;
}
return num;
}