0 1位移填充
using U_INT = unsigned int;
const U_INT True = 1u;
const U_INT False = 0u;
U_INT left_shift(U_INT v, int index)
{
//输入0 填充0,输入1 填充1
/*
* 计算机中位数,下标都是从零开始,比如 0b 0001,中的 1 为第0位。
* 若移动 3 位,则 0b 0001 变为0b 1000。
* 要实现填充为 1,则 1000 - 1 = 0111 ,然后,or(1000,0111) = 1111
* 相当于 0001,移动 3 位,并用 1 填充
*/
if (index >= 0 && index < 32)
{
v = (v << index) | ((v << index)-v);
}
return U_INT(v);
}
U_INT right_shift(U_INT v, int index)
{
/*
* 实现右移填充1,例 0001 变为 1000 是右移 1 位,将之取反为 0111
* 相当于左移 2 位并填充1 ,而 0001 为 4 位二进制数,最高位 为 3,
* 那么 最高位 3 减去 要移动的位数 1,然后左移填充 1,最后取反,0001
* 就变为 右移填充 1 就实现了
* 这个实现方法有个bug,因为 0001 右移填充的结果为 0001,
* 若依次右移填充为,1000,1100,1110,1111
*/
v= ~(left_shift(v, 31 - index));
return U_INT(v);
}
0 1 颜色转换
在用颜色表示开关状态变化时,往往需要两个不同的颜色,以黑白颜色为例,两色的RGB值分别为,0x ff ff ff ,0x 00 00 00。设 1 表示转换,0表示不转换,那么实现代码为:
#define WHITE 0xffffffu
#define BLACK 0x000000u
#define COLOR_BIT_MAX 23 //表示RGB值最大可以用24位二进制数表示
void change_color(int sign,int nowColor,int targetColor)
{
sign = 0x80000000|(left_shift(sign, COLOR_BIT_MAX))
// 0 还是 0 ,1 变为 0xffffff
// 或上 0x80000000 是为了保持符号位不变 sign 值为 0x80ffffff
nowColor = nowColor - ((nowColor - targetColor)&sign);
//若nowColor 为黑色,targetColor 为白色,sign 为 1
//则nowColor - targetColor 为负数,减去一个负数相当于加上负数的绝对值
//则nowColor 变为白色,反之,则 减去两个颜色的差,即为减去两者之间的距离
}
//互换两个数的值
void exchange(int& a,int& b)
{
a = a - b;//得到两者的差 a = 1 , b = 2, a = -1
b = b + a;//b现在为a的值 2 + (-1) = 1
a = b - a;//a现在为a的值 1 - (-1) = 2, 最终,a = 2 ,b = 1
}