posts - 183,  comments - 10,  trackbacks - 0

将一个 int 型的数按位输出。进行循环移位,检测最左边的位是否非零,然后输出 1 或 0 即可。

对 int 型的数中的位进行逆序。考虑逆序的特征,可以利用栈进行逆序,从左往右进行压栈,弹出的时候 ret = 2 * ret + s.top();

如果从右往左压栈,在弹出栈的时候,有个记录项 m = 0;ret = ret + pow(2, m++)。

也可以采用另一种方式在原地逆序,循环这个位。对左右两边的对称位进行检测,设置各自的掩码。如果左右两边的位不一致,则相互设置相反。

为的逆序来自一思科面试题。

实现:

  1 #include <iostream>
  2 #include <stack>
  3 using namespace std;
  4 
  5 // 输入一个 int 数的二进制位
  6 void foo(int n)
  7 {
  8     static int t = 1 << (sizeof (int* 8 - 1);
  9     for (int i = 0; i < sizeof (n) * 8++i)
 10     {
 11         if ((n & t) == 0)
 12         {
 13             cout << 0;
 14         }
 15         else
 16         {
 17             cout << 1;
 18         }
 19         n <<= 1;
 20     }
 21     cout << endl;
 22 }
 23 
 24 // 将 int 中的各位逆序
 25 // 这里使用一个栈来实现逆序
 26 int bar(int* a, int b)
 27 {
 28     static int t = 1 << (sizeof (int* 8 - 1);
 29     *= 0;
 30     stack<int> s;
 31     for (int i = 0; i < sizeof (int* 8 - 1++i)
 32     {
 33         if ((b & t) == 0)
 34         {
 35             s.push(0);
 36         }
 37         else
 38         {
 39             s.push(1);
 40         }
 41         b <<= 1;
 42     }
 43     while (!s.empty())
 44     {
 45         *= 2 * (*a) + s.top();
 46         s.pop();
 47     }
 48     return *a;
 49 }
 50 
 51 // 第二种实现方式
 52 // 直接在原地交换,设置掩码
 53 int reverse(int n)
 54 {
 55     int len = sizeof (int* 8;
 56     int a, b;
 57     int t1, t2;
 58     // int t = -1;
 59     int t = 0;
 60     t = (1 << (len - 1)) - 1 + (1 << (len - 1));
 61     for (int i = 0; i < len / 2++i)
 62     {
 63         t1 = 1 << (len - i - 1);
 64         t2 = 1 << i;
 65         a = t1 & n;
 66         b = t2 & n;
 67         cout << "test" << endl;
 68         foo(t1);
 69         foo(t2);
 70         foo(a);
 71         foo(b);
 72         foo(t);
 73         if (a == 0 && b != 0)
 74         {
 75             n &= (t - t2);
 76             n |= t1;
 77         }
 78         else if (a != 0 && b == 0)
 79         {
 80             n &= (t - t1);
 81             n |= t2;
 82         }
 83         foo(n);
 84     }
 85     return n;
 86 }
 87 
 88 int main()
 89 {
 90     int n = 2// 2;
 91     cout << (n << 1<< endl;
 92     cout << (n >> 1<< endl;
 93 
 94     foo(n);
 95     foo(-2);
 96     foo(1 << (sizeof (int* 8 - 1));
 97 
 98     n = 2;
 99     int m;
100     m = bar(&m, n);
101     foo(n);
102     foo(m);
103 
104     n = 7;
105     m = reverse(n);
106     foo(n);
107     foo(m);
108     return 0;
109 }

 

posted on 2011-05-19 14:14 unixfy 阅读(561) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理