请问如何实现这个算法

[复制链接]
2905|17
 楼主| xlsbz 发表于 2012-4-6 11:26 | 显示全部楼层 |阅读模式
请问如何将一个定义为unsigned char类型的变量  用 一个函数 可以实现 将其某位 置1或 置0.??

用一个宏定义又如何实现呢? 多谢

多谢 。

想了好久  弄不出来  呵呵
zd420325 发表于 2012-4-6 11:32 | 显示全部楼层
unsigned char test;
test&=0xfe;//第0位清零
test|=0x01;//test|=0x00;  ////第0位置一或清零.
ayb_ice 发表于 2012-4-6 11:33 | 显示全部楼层
与或操作都不会吗
 楼主| xlsbz 发表于 2012-4-6 12:11 | 显示全部楼层
本帖最后由 xlsbz 于 2012-4-6 12:15 编辑

我说的是用一个函数 或 用一个宏定义哦   大侠

现在用
#define SETBIT(tmp,Num) tmp |= (INT8U)(1 << Num)    // 对REG的N位置1
#define CLRBIT(tmp,Num) tmp &= (INT8U)(~(1 << Num)) // 对REG的N位清零

这用了两个宏定义

请问如何用一个函数或一个宏定义??不能用return
lxyppc 发表于 2012-4-6 12:18 | 显示全部楼层
#define OP_BIT(tmp,num,b) b ? SETBIT(tmp,Num) : CLRBIT(tmp,Num)
 楼主| xlsbz 发表于 2012-4-6 12:26 | 显示全部楼层
#define BITSET(tmp, Num,YN)  BitSet(&tmp, Num, YN)

void BitSet(INT8U * tmp_ptr, INT8U Num, INT8U YN)
{

    if (YN == 1) {
        *tmp_ptr |= (INT8U)(1 << Num);
    }
    else {
        *tmp_ptr &= (INT8U)(~(1 << Num));   
    }
}
我刚想的
 楼主| xlsbz 发表于 2012-4-6 12:31 | 显示全部楼层
5# lxyppc
你这属于return啊
 楼主| xlsbz 发表于 2012-4-6 12:51 | 显示全部楼层
#define BITSET(tmp, Num,YN)  BitSet(&tmp, Num, YN)

void BitSet(INT8U * tmp_ptr, INT8U Num, INT8U YN)
{

    if (YN == 1) {
        *tmp_ptr |= (INT8U)(1
xlsbz 发表于 2012-4-6 12:26


看了下汇编  效率还挺不错

大家有好的函数贡献一下 啊  


我的函数8位机下面没啥问题
lxyppc 发表于 2012-4-6 13:02 | 显示全部楼层
#define BITSET(tmp, Num,YN)  tmp ^= ((tmp&(1<<Num)) ^ (YN<<NUM))
 楼主| xlsbz 发表于 2012-4-6 13:12 | 显示全部楼层
#define BITSET(tmp, Num,YN)  tmp ^= ((tmp&(1
lxyppc 发表于 2012-4-6 13:02



看了下,C效率太低了!!

建议加上强制

由于我对这个抑或不熟,不太好理解

但是看起来很好,很简洁 。
lxyppc 发表于 2012-4-6 13:54 | 显示全部楼层
其实原理很简单
a^b^a = b
a^0^0 = a
要改变第3位
a0a1a2a3a4a5a6a7^000a30000^000b30000 = a0a1a2b3a4a5a6a7
a3 => tmp & (1<<3)
b3 => b<<3

tmp = tmp ^ (tmp & (1<<3)) ^ (b<<3)
原野之狼 发表于 2012-4-6 14:23 | 显示全部楼层
不明白为什么要整合?  LZ说说看。。。
 楼主| xlsbz 发表于 2012-4-6 15:02 | 显示全部楼层
其实原理很简单
a^b^a = b
a^0^0 = a
要改变第3位
a0a1a2a3a4a5a6a7^000a30000^000b30000 = a0a1a2b3a4a5a6a7
a3 => tmp & (1
lxyppc 发表于 2012-4-6 13:54


你属于那种聪明  知识扎实的。
 楼主| xlsbz 发表于 2012-4-6 15:03 | 显示全部楼层
不明白为什么要整合?  LZ说说看。。。
原野之狼 发表于 2012-4-6 14:23


我看组态王里面有这么一个函数 。

整合为了好看点啊,个人喜好 可能
abcsmile 发表于 2012-4-6 15:32 | 显示全部楼层
学习了
nongfuxu 发表于 2012-4-6 19:10 | 显示全部楼层
路过.
*1*
a^b^a = b
a^0^0 = a
*2*
用指针返回
海川先生 发表于 2012-4-6 21:21 | 显示全部楼层
其实原理很简单
a^b^a = b
a^0^0 = a
要改变第3位
a0a1a2a3a4a5a6a7^000a30000^000b30000 = a0a1a2b3a4a5a6a7
a3 => tmp & (1
lxyppc 发表于 2012-4-6 13:54

高明
mcu5i51 发表于 2012-4-7 07:01 | 显示全部楼层
MyInc.h
...
#define  BIT(b)                 (1<<b)
...
//2011/9/28
#define LetBit(sfrs,byte,bit) (sfrs = (sfrs & ~byte) | (bit ? byte : 0))
// #define Led(x) SetBit(P1OUT,BIT(0),x)   
// Led(0),Led(1);


简单,高效
您需要登录后才可以回帖 登录 | 注册

本版积分规则

190

主题

1614

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部