將一個 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 *a = 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 *a = 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 閱讀(571)
評論(0) 編輯 收藏 引用