Skip to content

Commit efa05ae

Browse files
committed
add bit (14-2)
1 parent 13249aa commit efa05ae

File tree

1 file changed

+114
-0
lines changed

1 file changed

+114
-0
lines changed

source/bit.c

+114
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
//
2+
// bit.c
3+
// Algorithms - Bit operations
4+
//
5+
// Created by YourtionGuo on 17/05/2017.
6+
// Copyright © 2017 Yourtion. All rights reserved.
7+
//
8+
9+
10+
#include <string.h>
11+
12+
#include "bit.h"
13+
14+
#pragma mark - Public
15+
16+
int bit_get(const unsigned char *bits, int pos)
17+
{
18+
unsigned char mask;
19+
int i;
20+
21+
/// 设置位获取掩码
22+
mask = 0x80;
23+
24+
for (i = 0; i < (pos % 8); i++) {
25+
mask = mask >> 1;
26+
}
27+
28+
/// 获取位
29+
return (((mask & bits[(int)(pos / 8)]) == mask) ? 1 : 0);
30+
}
31+
32+
33+
void bit_set(unsigned char *bits, int pos, int state)
34+
{
35+
unsigned char mask;
36+
int i;
37+
38+
/// 设置位获取掩码
39+
mask = 0x80;
40+
41+
for (i = 0; i < (pos % 8); i++) {
42+
mask = mask >> 1;
43+
}
44+
45+
/// 设置位
46+
if (state) {
47+
bits[pos / 8] = bits[pos / 8] | mask;
48+
} else {
49+
bits[pos / 8] = bits[pos / 8] & (~mask);
50+
}
51+
52+
return;
53+
}
54+
55+
56+
void bit_xor(const unsigned char *bits1, const unsigned char *bits2, unsigned char *bitsx, int size)
57+
{
58+
int i;
59+
60+
/// 按位计算两个缓存区的异或值
61+
62+
for (i = 0; i < size; i++) {
63+
64+
if (bit_get(bits1, i) != bit_get(bits2, i)) {
65+
bit_set(bitsx, i, 1);
66+
} else {
67+
bit_set(bitsx, i, 0);
68+
}
69+
}
70+
71+
return;
72+
}
73+
74+
75+
76+
void bit_rot_left(unsigned char *bits, int size, int count)
77+
{
78+
int fbit = 0, lbit, i, j;
79+
80+
/// 向左轮转缓冲区特定位数
81+
82+
if (size > 0) {
83+
84+
for (j = 0; j < count; j++) {
85+
86+
for (i = 0; i <= ((size - 1) / 8); i++) {
87+
88+
/// 获取即将被替换的位的值
89+
lbit = bit_get(&bits[i], 0);
90+
91+
if (i == 0) {
92+
93+
/// 将第一个位保存起来
94+
fbit = lbit;
95+
96+
} else {
97+
98+
/// 将前一个字节最右边的位移到当前字节的最左边
99+
bit_set(&bits[i - 1], 7, lbit);
100+
}
101+
102+
/// 将特定位向左移动
103+
bits[i] = bits[i] << 1;
104+
}
105+
106+
/// 将其最右边的位移动到首字节的最高位上
107+
108+
bit_set(bits, size - 1, fbit);
109+
}
110+
}
111+
112+
return;
113+
}
114+

0 commit comments

Comments
 (0)