一、位运算符用法
C语言中的位运算符主要有以下几种:
使用的时候主要有以下几个注意点:
1.左移运算符将<<将运算数的二进位左移,高位丢弃,低位补零。
2.右移运算符将>>将运算数的二进位右移,低位丢弃,高位补零。
3.避免位运算符,逻辑运算符和数学运算符出现在同一个表达式中,如果要在同一个表达式中出现,那么需要用括号来表达运算次序。
4.左移n位相当于乘以2的n次方,右移n位相当于除以2的n次方,但是他们的运算效率要比数学运算符高。
不用第三个中间变量实现两个数的交换:
方法1:
a=a+b;
b=a-b;
a=a-b;
方法2:
a=a^b;
b=a^b;
a=a^b;
面试题解析:
有一个数列,其中的自然数都是以偶数的形式出现,只有一个自然数出现的次数为奇数次。编写程序找出这个自然数。
最简单的方法使用异或方法,如下:
这主要运用了两个规则:第一,自己和自己异或等于0;第二:异或具有交换律的特性。
1<<32位的结果是什么?1<<-1的结果是什么?
编译出现如下错误:
其实这个是可以理解的,因为我们数据int时32位的,这样就越界了,负数这里不允许移位,在我看来也没有什么具体的意义,如有知道的大侠可以告知。
二、位运算符用法
C语言中提供了三种逻辑运算符:
- &&(与运算)
- ||(或运算)
- !(非运算)
与运算符(&&)和或运算符(||)均为双目运算符。具有左结合性。非运算符(!)为单目运算符,具有右结合性。逻辑运算符和其它运算符优先级的关系可表示如下:
“&&”和“||”低于关系运算符,“!”高于算术运算符。
按照运算符的优先顺序可以得出:
- a>b && c>d 等价于 (a>b)&&(c>d)
- !b==c||d<a 等价于 ((!b)==c)||(d<a)
- a+b>c&&x+y<b 等价于 ((a+b)>c)&&((x+y)<b)
逻辑运算的值
逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”来表示。其求值规则如下:1) 与运算(&&)
参与运算的两个量都为真时,结果才为真,否则为假。例如:
5>0 && 4>2
由于5>0为真,4>2也为真,相与的结果也为真。
2) 或运算(||)
参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。例如:
5>0||5>8
由于5>0为真,相或的结果也就为真。
3) 非运算(!)
参与运算量为真时,结果为假;参与运算量为假时,结果为真。例如:
!(5>0)
的结果为假。
虽然C编译在给出逻辑运算值时,以“1”代表“真”,“0 ”代表“假”。但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”。例如:
由于5和3均为非“0”因此5&&3的值为“真”,即为1。
又如:
5||0的值为“真”,即为1。