目录
十进制与二进制的转换:
相信看了这张图,多少会对二进制与十进制的转换有一点了解了。
原码,反码,补码
******在内存中存储一个数都是存的补码
******C语言中,0为假,非0为真。
******负数的符号位为1,正数的符号为0
以上都是一些必备知识,这里简单介绍下。
移位操作符:(>> <<)
移位操作符的面对的操作对象主要是这个数的二进制位了。
且因为内存中存储的都是补码,所以在这个数是负数的时候注意要把它化成补码的形式。
左移操作符 << :
左移运算符:(主要是左边丢弃,右边补0)
正数的原,反,补码都是一样的
正整数的左移运算符:左边丢弃,右边补0
负整数的左移运算符:因为内存中存储的是数的补码,所以得先把负整数给化成补码
然后再左移,再左边丢弃,右边补0
再把移位后的补码给化成原码输出
右移运算符:>>
右移运算符:
有两种方式:
算术右移:右边丢弃,左边补原符号位逻辑右移:右边丢弃,左边补0
到底是选择算术右移还是逻辑右移,取决于你当前使用的编译器。
***对移位运算符,尽量不要移动负数位,这是标准未定义的
例如:>>-1
这个到底是右移-1位还是左移一位,这是没有定义的。
位操作符(& | ^)
移位操作符的面对的操作对象主要是这个数的二进制位了。
且因为内存中存储的都是补码,所以在这个数是负数的时候注意要把它化成补码的形式。
按位与 |
全是1才是1 |
有0就是0 |
按位与 |
有1就是1 |
按位异或 |
相异为1,相同为0 |
逻辑操作符: (&& ||)
逻辑与 |
全真为真 |
遇假则假 |
逻辑或 |
有真为真 |
关于逻辑逻辑操作符的一道题目:
int main() {
//经典面试题
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a = %d\n b = %d\n c = %d\n d = %d\n", a, b, c, d);
return 0;
//猜测输出结果,并且将a的值改变和将换个逻辑运算符来测试
}
可能很多人的答案是:1,3,3,5吧?因为刚开始做这个题我也觉得是这个。
但是这个是当a=1的时候才会是这个结果。
正确答案:输出为1,2,3,4
原因:因为这个使用的是逻辑与符号,则我们知道逻辑与是遇假则假。以上代码中a=0,为假,则逻辑或后面的运算也就不会再进行了。
这里,如果感兴趣的话,还可以讲其中的&&换成||,来考验下自己的对逻辑操作符的理解了。