《2017年10月27日》【连续017天】
标题:位运算的学习和字符串的初步了解
内容:A.观看MOOC6.5,7.1;
B.(a).位运算:用于对整数类型(如int,char,long等)变量中某一位(bit)或若干位进行操作。
位运算有六种运算符:
& 按位与(双目):
将参与运算的两操作数各对应的二进制位进行与操作(当对应的两个二进制位均为1时,结果的二进制位才为1,否则为0)
21 & 18 结果为16
21:0001 0101 (注意,int类型有32位,short类型有16位,21的前24位均为0,我进行了省略)
18:0001 0010 (前24位省略)
16:0001 0000 (前24位省略)
通常可用来使某变量的某些位清零,其它位不变;
如:将int型变量的低8位置成0,其余位不变:n =n & 0xffffff00 (同n &=0xffffff00);如果n是short类型的,则只需执行:n &= 0xff00;(十六进制的一位相当于二进制的四位)
也可以获取某变量中某一位;
如:判断int型变量n的第七位(从右到左,从0开始(即第0位,第1位,……,第31位)是否为1:n &=0x80 (0x80 :1000 0000)
| 按位或(双目)
将参与运算的两操作数各对应的二进制位进行或操作(当对应的两个二进制位均为0时,结果的二进制位才为0,否则为1)
21 | 18结果为23:0001 0111(前24位省略)
通常可用来使某变量的某些位置1,其它位不变;
如:将int型变量的低8位全置1,其它位不变:n |= 0xff;(0xff: 1111 1111)
^ 按位异或(双目)
将参与运算的两操作数各对应的二进制位进行异或操作(当对应的两个二进制位不相同时,结果的二进制位才为1,否则为0)
21 ^ 18结果为7:0000 0111(前24位省略)
通常可用来使某变量的某些位取反,其它位不变;
如:将int型变量的低8位取反,其它位不变:n ^=0xff;
特点:a^b=c,则c^b=a,c^a=b。
如:int a=5,b=7;
a=a^b;
b=b^a;
a=a^b;
cout<<a<<" "<<b;
运行结果为7 5;
~ 按位非(取反)(单目)
将操作数中的二进制位0变成1,1变成0;
21:0000 0000 0000 0000 0000 0000 0001 0101
~21:1111 1111 1111 1111 1111 1111 1110 1010
<< 左移(双目)
表达式:a<<b;它的值是将a的各二进制位全部左移b位得到的值。高位丢弃,低位补0;a值不因运算而改变;
实际上,左移1位,等于乘以2,左移n位,等于乘以2^n,而左移比乘法快得多;
>> 右移 (双目)
表达式:a>>b;它的值是将a的各二进制位全部右移b位得到的值。右移时,低位丢弃;a值不变;
对于有符号数,(long,int ,short,char等),符号位(即最高位)将一起移动,如果原符号位为1,高位补1,原符号位为0,高位补0;
右移n位,相当于除以2^n,且结果往小取整;
例题:int a,n(0<=n<=31);求表达式,使表达式的值和a的第n位相同;
(a>>n) &1;
当0<=n<31时,(a &(1<<n))>>n(当n=31事,n为符号位,若符号位为1,则最后右移后,结果不为1,为0xffffffff)
(b).字符串有三种形式:1.用双引号括起来的字符串常量;
2.存放于字符数组中,以‘、0’字符结尾;
3.string对象;
字符串常量:字符串常量占据的内存的字节数相当于字符串中字符数目加1;多出来的是结尾字符'\0';
字符串长度不包含'\0';
""是合法的字符串常量,称为“空串”,占据一个字节,存放'\0';
双引号'\"',斜杠'\\',详见004day
明日计划:继续学习字符串;