码迷,mamicode.com
首页 > 编程语言 > 详细

C语言位运算遇到的坑

时间:2018-02-13 19:54:49      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:amp   个数   语言   gpo   pre   取反   而在   return   相同   

在Data Lab中有一个logicalShift函数给定一个值x和需要移动的位数n,要求只是用运算符:~ & ^ | + << >>,实现逻辑右移运算。思考了很久,然后我写出了如下的代码:

/* 
 * logicalShift - shift x to the right by n, using a logical shift
 *   Can assume that 0 <= n <= 31
 *   Examples: logicalShift(0x87654321,4) = 0x08765432
     Legal ops: !  & ^ | + << >>
 *   Max ops: 20
*   Rating: 3 
 */
int logicalShift(int x, int n) {
 return ( x >> n ) & ~( ( ( x & 0x80000000) >> n ) << 0x1) );
}

我的思路是:

  1. 如果x是负值,x >> n会让所有位右移n位,前n位补1,而在逻辑右移中前n位补0。解决这个问题,只需要把除去最高位的其他位置0,然后右移n位,再左移1位,再把这个数取反,和原来右移n位的值按位and,即可得到正确的结果。
  2. 如果x是正值,因为x & 0x80000000得到的结果为0,因此~( ( ( x & 0x80000000) >> n ) << 0x1) )为全1,不影响左边的计算结果。事实上对于正值,逻辑右移和逻辑左移是相同的。
    比如:
x n x >> n x & 0x80000000 x & 0x80000000) >> n ( ( x & 0x80000000) >> n ) << 0x1) ~( ( ( x & 0x80000000) >> n ) << 0x1) ) Result
0x80000000 2 0xe0000000 0x80000000 0xe0000000 0xc0000000 0x3fffffff 0x20000000

C语言位运算遇到的坑

标签:amp   个数   语言   gpo   pre   取反   而在   return   相同   

原文地址:https://www.cnblogs.com/dreamnwx1/p/8447249.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!