滑动窗口法
bit位
// 滑动窗口函数
unsigned char slidingFilter(char inputValue, SlidingWindow *window)
{
// 清除当前索引的比特位
window->values &= ~(1 << window->index);
// 如果 inputValue 为 true,则设置当前索引的比特位为 1
if (inputValue)
{
window->values |= 1 << window->index;
}
// 更新索引
window->index = (window->index + 1) % WINDOW_SIZE;
// 判断窗口内的比特位是否全部为1
unsigned char allOnes = (1 << WINDOW_SIZE) - 1; //用宏可以省计算量
if (window->values == allOnes)
{
return 1;
}
else if (window->values == 0)
{
return 0;
}
else
{
return 2; // 其他正在运行
}
}
#include <stdio.h>
#define WINDOW_SIZE 8
// 假设要存储的比特值只能是 true (1) 或 false (0)
typedef struct
{
unsigned char values; // 8位比特值
int index; // 当前插入索引
} SlidingWindow;
SlidingWindow pot_window;
// 初始化滑动窗口
void initSlidingWindow(SlidingWindow *window);
// 滑动窗口函数
unsigned char slidingFilter(char inputValue, SlidingWindow *window);
// 初始化滑动窗口
void initSlidingWindow(SlidingWindow *window)
{
window->values = 0; // 将所有比特位都设置为0
window->index = 0;
}
// 滑动窗口函数
unsigned char slidingFilter(char inputValue, SlidingWindow *window)
{
// 清除当前索引的比特位
window->values &= ~(1 << window->index);
// 如果 inputValue 为 true,则设置当前索引的比特位为 1
if (inputValue)
{
window->values |= 1 << window->index;
}
// 更新索引
window->index = (window->index + 1) % WINDOW_SIZE;
// 返回当前比特位状态
if (0xff == window->values)
{
return 0xff;
}
return 0;
}
注意,在这段代码中,初始的窗口数组被初始化为全-2。确保这个初始化值不会与你期望的输入值混淆。此外,根据你的实际应用,可能需要考虑如何处理数组未满时的情况。
#include <stdio.h>
#define WINDOW_SIZE 30
#define INIT_VALUE -2
// 定义一个结构体来保存滑动窗口的状态
typedef struct
{
int values[WINDOW_SIZE]; // 存储窗口中的值
int index; // 当前值的索引
} SlidingWindow;
// 初始化滑动窗口
void initSlidingWindow(SlidingWindow *window)
{
for (int i = 0; i < WINDOW_SIZE; i++)
{
window->values[i] = INIT_VALUE; // 初始化所有值为INIT_VALUE
}
window->index = 0;
}
// 检查窗口内的值是否全部相同
int areAllValuesSame(const int *values, int size)
{
for (int i = 1; i < size; i++)
{
if (values[i] != values[0])
{
return 0;
}
}
return 1;
}
// 滑动窗口函数
int slidingFilter(int inputValue, SlidingWindow *window)
{
// 更新滑动窗口的值
window->values[window->index] = inputValue;
// 更新索引
window->index = (window->index + 1) % WINDOW_SIZE;
// 检查窗口内所有值是否一致
if (areAllValuesSame(window->values, WINDOW_SIZE))
{
return window->values[(window->index + WINDOW_SIZE - 1) % WINDOW_SIZE];
}
else
{
return INIT_VALUE;
}
}
int main(void)
{
SlidingWindow window; // 创建一个SlidingWindow结构体实例
initSlidingWindow(&window); // 初始化窗口
int result;
// 示范如何使用滑动窗口
for (int i = 0; i < 35; i++)
{
result = slidingFilter(100, &window);
if (result != INIT_VALUE)
{
printf("Filter Output: %d\n", result);
}
}
// 模拟非连续的输入
for (int i = 0; i < 30; i++)
{
result = slidingFilter(i, &window);
if (result != INIT_VALUE)
{
printf("Unfiltered Output: %d\n", result);
}
}
return 0;
}