打印

请问如何实现这个算法

[复制链接]
2190|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xlsbz|  楼主 | 2012-4-6 11:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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

使用特权

评论回复
5
lxyppc| | 2012-4-6 12:18 | 只看该作者
#define OP_BIT(tmp,num,b) b ? SETBIT(tmp,Num) : CLRBIT(tmp,Num)

使用特权

评论回复
6
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));   
    }
}
我刚想的

使用特权

评论回复
7
xlsbz|  楼主 | 2012-4-6 12:31 | 只看该作者
5# lxyppc
你这属于return啊

使用特权

评论回复
8
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位机下面没啥问题

使用特权

评论回复
9
lxyppc| | 2012-4-6 13:02 | 只看该作者
#define BITSET(tmp, Num,YN)  tmp ^= ((tmp&(1<<Num)) ^ (YN<<NUM))

使用特权

评论回复
10
xlsbz|  楼主 | 2012-4-6 13:12 | 只看该作者
#define BITSET(tmp, Num,YN)  tmp ^= ((tmp&(1
lxyppc 发表于 2012-4-6 13:02



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

建议加上强制

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

但是看起来很好,很简洁 。

使用特权

评论回复
11
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)

使用特权

评论回复
12
原野之狼| | 2012-4-6 14:23 | 只看该作者
不明白为什么要整合?  LZ说说看。。。

使用特权

评论回复
13
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


你属于那种聪明  知识扎实的。

使用特权

评论回复
14
xlsbz|  楼主 | 2012-4-6 15:03 | 只看该作者
不明白为什么要整合?  LZ说说看。。。
原野之狼 发表于 2012-4-6 14:23


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

整合为了好看点啊,个人喜好 可能

使用特权

评论回复
15
abcsmile| | 2012-4-6 15:32 | 只看该作者
学习了

使用特权

评论回复
16
nongfuxu| | 2012-4-6 19:10 | 只看该作者
路过.
*1*
a^b^a = b
a^0^0 = a
*2*
用指针返回

使用特权

评论回复
17
海川先生| | 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

高明

使用特权

评论回复
18
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

粉丝