真真假假的布尔类型
C/C++语言中,有两种 bool(布尔)类型的表示方式:
第一种:直接使用 bool 类型
bool 类型, 只有两个值:true、false
例: bool a = true;
第二种:使用 0 和非 0 的任何值(C 语言风格)
0: 表示假
非 0: 表示真
回想一下我们之前字符串的比较所讲
(C++类型):
std::string a = “123”;
std::string b = “1230”;
a < b (为真)
最后a与b比较的结果就是布尔值:true或false
通常比较运算的结果:都是逻辑值
那么如果是C语言的字符串我们怎么比较呢? 稍微有些不同:
我们需要增加头文件,并使用其中的函数:
#include <string.h>
int strcmp( const char *str1, const char *str2 );
//例如:
int ret;
ret = strcmp(str1, str2);
/*
返回值:
str1 < str2 时, 返回值< 0(有些编译器返回 -1)
str1 > str2 时, 返回值> 0(有些编译器返回 1)
str1 等于 str2 时, 返回值为 0
*/
“与或非”逻辑运算
与 C 语言完全相同。
逻辑与 &&
都为真,逻辑与才是真
只要有一个为假,逻辑与就是假
相当于我们日常生活中说的 “并且”
特别注意:
条件 1 && 条件 2
当条件 1 为真时,才去判断条件 2
当条件 1 为假时,就不再判断条件 2
逻辑或 ||
只要有一个是真, 结果就是真
都为假时,结果才是假
相当于我们日常生活中说的 “或者”
特别注意:
条件 1 || 条件 2
当条件 1 为真时,就不再判断条件 2
当条件 1 为假时,才判断条件 2
逻辑非 !
是”单目运算符”, 即:只有一个操作数
相当于“不”
特别注意:
逻辑非,只对一个条件进行运算!
是一种“单目运算符”
操作硬件的位运算
各位少侠,学过了逻辑运算,我们趁热打铁赶紧学习一下硬件的位运算操作。
什么是位?
内存的基本单元是字节, 一个字节有 8 位
位与 &
0 & 0 结果为 0
0 & 1 结果为 0
1 & 0 结果为 0
1 & 1 结果为 1
思想和 与&&逻辑相同,只不过我们计算的是0和1,同为1结果才是1
例: 3&4
3在计算机中以二进制储存是00000011
4在计算机中以二进制储存是00000100
根据我们的运算思想最终结果是00000000
位或 |
0 | 0 结果为 0
0 | 1 结果为 1
1 | 0 结果为 1
1 | 1 结果为 1
思想和 或||逻辑相同,只不过我们计算的是0和1,同为0结果才是0
例: 3|4
3在计算机中以二进制储存是00000011
4在计算机中以二进制储存是00000100
根据我们的运算思想最终结果是00000111
位非 ~
~ 1 结果为 0
~ 0 结果为 1
思想和 !非逻辑相同,就是取反
例: ~3
3在计算机中以二进制储存是00000011
根据我们的运算思想最终结果是11111100
异或 ^
0 ^ 0 结果为 0
1 ^ 1 结果为 0
0 ^ 1 结果为 1
1 ^ 0 结果为 1
运算思想重在一个“异”,不相同为 1,相同为0
<< 左移
右边的位用 0 来填充, 移动超出左边边界的位则直接抛弃。(别忘了一个字节最高8位)
向左移动 n 个位置,就等同于乘以 2 的 n 次方
例: 8 << 3(8左移三位)
8在计算机中以二进制储存是00001000
根 据我们的思想最终结果是01000000 //8 * 2 * 2 * 2
>> 右移
如果左操作数是无符号类型,则左边多出来的位用 0 来填充。
如果左操作数是有符号类型,则左边多出来的位用 符号位(最高位) 来填充。
向左移动 n 个位置,就等同于除以 2 的 n 次方
例: 8 >> 3(8右移三位)
8在计算机中以二进制储存是00001000
根 据我们的思想最终结果是00000001 // 8 / 2 /2 / 2