OSDN Git Service

addid library source 20140221
[zither/ds-zither.git] / sources / lib / libms / bit.c
1 // Bit 演算の道具
2
3 #include<stdio.h>
4 #include<string.h>
5 #include <stdlib.h>
6
7 // #define INBIT_BUG
8
9
10 // char * out_bit(unsigned int ina, char * bit, int bx)
11 // unsigned long in_bit(char * bit, char bx)
12
13
14
15 // BIT表現の文字列 "01010101" を数字として変数に入れる
16 // 1: 1,0を使ったBIT表現の文字列ポインター 2: BIT数
17 unsigned long in_bit(char * bit, char bx)
18 {
19 unsigned long uca;
20 int max, co;
21
22 max = (int)strlen(bit);
23
24 if(bx < 8){ bx = 9; }
25 if(bx > 8 && bx < 16){ bx = 16; }
26 if(bx > 16 && bx < 32){ bx = 32; }
27 if(bx > 32){ bx = 32; }
28
29 if(max < bx || max > bx){
30    uca = -1;
31    #ifdef INBIT_BUG
32    printf("err not data size\n");
33    #endif
34    return uca;
35    }
36
37 for(co = 0; co < bx; co++){
38    if(bit[co] != '1' && bit[co] != '0'){
39       uca = -2;
40       #ifdef INBIT_BUG
41       printf("err not 0 or 1\n");
42       #endif
43       return uca;
44       }
45    }
46
47 uca = (unsigned long)strtoul(bit, (char **)NULL, 2);
48
49 #ifdef INBIT_BUG
50 printf("<%s> %d, %d, %d, %x\n", bit, max, bx, uca, uca);
51 #endif
52
53 return uca;
54 }
55
56
57
58
59
60 // 数字をBIT表現する
61 // 1: 表示したい変数 2: 予め32オクテット確保したポインター 3: 表示したいビット数
62 char * out_bit(unsigned int ina, char * bit, int bx)
63 {
64 char tib[34];
65 signed char co;
66 unsigned char con;
67 co = 0;
68 con = 0;
69
70 memset(tib, 0x00, 34);
71
72 if(bx < 8){ bx = 9; }
73 if(bx > 8 && bx < 16){ bx = 16; }
74 if(bx > 16 && bx < 32){ bx = 32; }
75 if(bx > 32){ bx = 32; }
76
77 while(ina){
78    tib[co++] = ina % 2 + '0';
79    ina = ina / 2;
80    if(co >= bx){
81       break;
82       }
83    }
84
85 if(co < bx){
86    while(1){
87       tib[co++] = '0';
88       if(co >= bx){
89          break;
90          }
91       }
92    }
93
94 for(co = (bx - 1); co >= 0; co--){
95    bit[con] = tib[co];
96    con++;
97    }
98
99 return bit;
100 }
101
102
103
104
105 /* お試しmain() 
106
107 int main(void)
108 {
109 char bit[34];
110
111 // 関数使用
112 unsigned char         ua8   = in_bit("10101010", 8);
113 unsigned short int    usi16 = in_bit("1010101001010101", 16);
114 unsigned long         ul32  = in_bit("00101010010101011111111100000000", 32);
115
116 memset(bit, 0x00, 34);
117
118 printf( "<%s><%02lx>\n", out_bit(ua8, bit, 8), ua8 ); 
119 printf( "<%s><%04lx>\n", out_bit(usi16, bit, 16), usi16 );
120 printf( "<%s><%08lx>\n", out_bit(ul32, bit, 32), ul32 );
121
122 memset(bit, 0x00, 34);
123
124 ua8 = in_bit("11111111", 8);
125 printf("-(1)-全部BITを立てた元データ-----------------------<%s><%d><0x%02lx>\n",
126   out_bit(ua8, bit, 8), ua8, ua8);
127
128 printf("-(2)-1の下位4BITをマスク(bit単位の論理and演算 &)---<%s><%d><0x%02lx>\n",
129   out_bit(ua8 & in_bit("11110000", 8), bit, 8), ua8 & in_bit("11110000", 8), ua8 & in_bit("11110000", 8));
130
131 ua8 = in_bit("00000000", 8);
132 printf("-(3)-全部BITをマスクした元データ-------------------<%s><%d><0x%02lx>\n",
133   out_bit(ua8, bit, 8), ua8, ua8);
134
135 printf("-(4)-3の上位4BITをON(bit単位の論理or演算 |)--------<%s><%d><0x%02lx>\n",
136   out_bit(ua8 | in_bit("11110000", 8), bit, 8), ua8 | in_bit("11110000", 8), ua8 | in_bit("11110000", 8));
137
138 ua8 = in_bit("01010101", 8);
139 printf("-(5)-交互にビットを立てた元データ------------------<%s><%d><0x%02lx>\n",
140   out_bit(ua8, bit, 8), ua8, ua8);
141
142 printf("-(6)-5の下位4BITを反転(bit単位の排他論理or演算 ^)--<%s><%d><0x%02lx>\n",
143   out_bit(ua8 ^ in_bit("00001111", 8), bit, 8), ua8 ^ in_bit("00001111", 8), ua8 ^ in_bit("00001111", 8));
144
145 printf("-(7)-5の全てのBITを無条件で反転(補数演算 ~)--------<%s><0x%02lx>\n",
146   out_bit(~ua8, bit, 8), ~ua8);
147
148 printf("-(8)-5を左に3BITシフト(左シフト演算 <<)------------<%s><0x%02lx>\n",
149   out_bit(ua8 << 3, bit, 8), ua8 << 3);
150
151 printf("-(9)-5を右に3BITシフト(右シフト演算 >>)------------<%s><0x%02lx>\n",
152   out_bit(ua8 >> 3, bit, 8), ua8 >> 3);
153
154 usi16 = in_bit("1010101010101010", 16);
155 printf("-(10)-交互にビットを立てた元データ(16Bit)----------<%s><0x%04lx>\n",
156    out_bit(usi16, bit, 16), usi16);
157
158 ul32 = in_bit("10101010101010110101010101010101", 32);
159 printf("-(11)-交互にビットを立てた元データ(32Bit)----------<%s><0x%08lx>\n",
160   out_bit(ul32, bit, 32), ul32);
161
162 printf("-(12)-11を補数で反転(32Bit補数演算)----------------<%s><0x%08lx>\n",
163   out_bit(~ul32, bit, 32), ~ul32);
164
165 printf("-(12)-11を左に16シフト(32Bit)----------------------<%s><0x%08lx>\n",
166   out_bit(ul32 << 16, bit, 32), ul32 << 16);
167
168 printf("-(12)-11を右に16シフト(32Bit)----------------------<%s><0x%08lx>\n",
169   out_bit(ul32 >> 16, bit, 32), ul32 << 16);
170
171 return 0;
172 }
173
174 */
175
176
177
178
179