每日代码分享2021-5-12

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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不过日落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值