|
|
|
|
移动端

1.10.3 位运算(1)

《程序员面试笔试真题与解析》本书针对当前各大 IT企业面试笔试中特性与侧重点,精心挑选了 3年以来近百家典型 IT企业的面试笔试真题,这些企业涉及业务包括系统软件、搜索引擎、电子商务、手机 APP、安全关键软件等,面试笔试真题非常具有代表性与参考性。本节为大家介绍位运算。

作者:猿媛之家来源:机械工业出版社|2017-12-06 17:14

年前最后一场技术盛宴 | 1月27日与京东、日志易技术大咖畅聊智能化运维发展趋势!


1.10.3 位运算(1)

【真题 141】下列操作符中,属于位操作的是()。

A.|B.^ C.&& D.<<

答案:A、B、D。

对于选项 A,|是按位或运算符,属于位操作。所以,选项 A正确。

对于选项 B,^是按位异或运算符,属于位操作。所以,选项 B正确。

对于选项 C,&&是逻辑与运算符,不属于位操作。所以,选项 C错误。

对于选项 D,<<是左移运算符,属于位操作。所以,选项 D正确。

【真题 142】有以下程序:

  1. #include<stdio.h> 
  2. main()  
  3. {  
  4. char x=2,y=2,z;  
  5. z=(y<<1)&(x>>1);  
  6. printf("%d\n",z);  
  7. } 

程序的输出结果是()。

A.1 B.0 C.4D.8 答案:B。左移 1位相当于乘以 2,右移 1位相当于除以 2,y<<1后的结果是 0000 0100,x>>1后的结果是 0000

0000,二者执行 &操作后,结果是 0。所以,选项 B正确。

【真题 143】执行 1100|1010,1001^1001,1001&1100后,其结果分别为()。

A.1110 0000 1000 B.1000 1001 1000

C.1110 1001 0101 D.1000 1001 1000 答案:A。对于或运算符|,有: 1 | 1 = 1,1 | 0= 1,0 | 1 = 1,0 |0 = 0。对于异或运算符 ^,有: 1 ^ 1 = 0,1 ^0 = 1,

0 ^1 = 1,0 ^0 = 0。对于与运算符 &,有: 1 & 1 = 1,1 & 0 = 0,0 & 1=0,0 & 0= 0。本题中,1100|1010=1110,1001^1001=0000,1001&1100=1000。所以,选项 A正确。

【真题 144】定义有整数 int i = 0xFE78DA45,int k = 0xAC3189B2,则 i^k的值为()。

A.0x524953f7 B.0xAC308800  C.0xFE79DBF7  D.0X0000001

答案:A。

按位异或就是在同一位置上,当两者相同时,结果位为 0,当两者不同时,结果位为 1。也就是说: 0^0=0,1^1=0,1^0=1,0^1=1。对于本题而言,可以首先计算高位的异或值: F^A=1111^1010=0101,0101转换为十进制后,该值为 5,符合条件的答案里面只有选项 A,从而排除了选项 B、选项 C和选项 D的可能性。

【真题 145】有如下代码:

  1. int func(int x)  
  2. {  
  3. int countx = 0;  
  4. while (x)  
  5. {  
  6. countx++;  
  7. xx = x&(x - 1);  
  8. }  
  9. return countx;  

假设 x的值为 65530,那么 func(x)的返回值是()。

A.20 B.16 C.100 D.14答案:D。解答本题的关键在于理解 x=x&(x-1)这条语句的作用。运算符 &是一个二进制的运算符号,表示的

是二进制的与操作,二进制与操作具有如下性质:只有当参与运算的两位同时为 “1”时,其运算结果才为“1”,否则,其运算结果为 0:0&0=0,0&1=0,1&0=0,1&1=1。例如,十进制数 10,其二进制表示为 1010,当它与十进制数 9(二进制表示为 1001)执行 &运算时,其结果为 1010 & 1001 = 1000。

对于表达式 x&(x-1)而言,其结果到底是什么呢? x会不断地与比它小 1的数进行与运算,每执行一次 x = x&(x-1)操作,会将 x用二进制表示时昀低位的一个 1变为 0,因为 x-1的二进制是把 x的二进制的昀低位的 1变成 0。这段代码的目的是就是计算 x 的二进制表示中 1的个数。 65530对应的二进制表示为 1111 1111 1111 1010,对应的二进制中有 14个 1。所以,选项 D正确。

【真题 146】有如下代码:

  1. int fun(int a)  
  2. {  
  3. a = (1 << 5) - 1;  
  4. return a;  

fun(21)的结果是( )。

A.10  B.8  C.5  D.31

答案:D。

函数的返回值与传递的参数无关。本题中,语句 1<<5相当于执行了 2的 5次方,值为 32,昀终的结果为 32-1= 31。所以,选项 D正确。

【真题 147】以下能够实现“判断一个非零整数 x是否是 2的幂”功能的表达式是()。

A.x&(~x) B.x&(!x) C.x&(x-1) D.x&(-x)答案:C。如何判断一个数是 2的幂,主要是要找出 2的幂次方的数的特点。通常, 1个数乘以 2就是将该数

左移 1位,而 2的 0次幂为 1,所以, 2的 n次幂(就是 2的 0次幂 n次乘以 2)就是将 1左移 n位,这样我们知道,如果一个数 n是 2的幂,则其对应的二进制数中只有一位是 1,必然有 n & (n -1)为 0。(在

求 1个数的二进制表示中 1的个数的时候说过, n&(n-1)去掉 n的昀后一个 1)。因此,判断一个数 n是否为 2的幂,只需要判断 n&(n-1)是否为 0即可。所以,选项 C正确。

【真题 148】交换两个变量的值,不使用第三个变量。即 a=3,b=5,交换之后 a=5,b=3。答案:有两种解法,一种为求和法,一种为异或法。

【真题 149】有如下代码:

  1. int foo(int x)  
  2. {  
  3. return x&-x;  

在 32位系统中,函数 foo(2^31-3)的值是( )。

A.0  B.1  C.2  D.4

答案:C。

为了解答本题,需要掌握下面两个知识点:

1)算术运算符比位运算符的运算优先级高,也就是说 x&-x 等价于 x&(-x),2^31-3等价于

2^(31-3)。

2)异或操作的规则如下:给定数字 a和 b,如果 a、b两个值不相同,则异或结果为 1,否则,异或结果为 0。

本题中 foo(2^31-3)的参数为 2^31-3,x的值为 2^31-3=2^28,在 32位系统中,转换为二进制数表示为 0000 0000 0000 0000 0000 0000 0001 1110,-x 的二进制表示为 0111 1111 1111 1111 1111 1111 1110 0010,所以, x&-x的结果的二进制表示为 0000 0000 0000 0000 0000 0000 0000 0010,将该二进制数转换为十进制数为 2。因此,选项 C正确。

【真题 150】有如下代码:

  1. int c = 23;  
  2. printf("%d\n", c&c); 

上述代码的运行结果为()。

A.0 B.46 C.23 D.以上都不对答案:C。按位与运算符 &是一个位运算符,当参与运算的位的值都为 1时,运算结果为 1,否则,运算结果为 0。

本题中,变量 c的初值为 23,由于表达式 c&c中参与运算的两个数的值是一样的,所以,当执行完&运算后,其结果也是 c,即为 23。所以,选项 C正确。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

嬴在用户:Web人物角色创建和应用实践指南

您如何保证您的网站确实给予用户他们所需要的,并对您产生商业成果?您需要了解谁是您的用户,您的用户的目标、行为和观点是什么,还要把他...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊