nhtoby

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  14 随笔 :: 1 文章 :: 5 评论 :: 0 引用

2008年8月11日 #

绝对说服的技巧

   在日常生活中你要别人帮助你,要别人心甘情愿的为你做事情,要别人买你的产品,要改变别人对一事物的看法,要解除别人的抗拒点,要领导你的团队等等都需要有非常强的说服力和说服技巧,每个人都有自己的思想和观点,那为什么要听你的呢?因为你说的很有道理,而且有思想别人无法抗拒你,那如何证明你说的是对的呢?你需要去证明它,要有事实别人才能相信你,要做到绝对的说服真不是件容易的事情,那是否一定就这么难呢?我看也未必;任何事情只要掌握方法和规律并不断的去实践运用都能取得比较好的效果,根据我多年的研究和市场实践经验----没有说服不了的人而只有说服不了的自己!

   所有的说服过程都是信念的改变过程。每一个信念的存在也都是由支点支撑起来的,没有了支点的支撑信念将无法存在,信念就象是桌面,支点是桌脚,没有桌脚桌面就支撑不起来;

比如陈安之老师问我:你叫谢祥春吗?

我:是的,

陈:谢祥春就是你吗?

我:是的,

陈:你真的叫谢祥春吗?

我:是的,(我叫谢祥春就是我的信念)

陈:你如何证明你就是谢祥春呢?

我:一我父母叫我谢祥春,二身份证是谢祥春,三朋友都叫我谢祥春(找出三个支点)

陈:你父母是否曾经说过谎话?

我:当然,只要是人不管是善意或者恶意都有点,

陈:有没有可能你不是谢祥春你父母告诉你叫谢祥春?

我:有可能,

陈:有没有可能你父亲也不姓谢,是你爷爷告诉他姓谢,你父亲也告诉你姓谢的?

我:有,

陈:有没有可能你是抱养的,你本来不姓谢,你父母告诉你姓谢而又不告诉你是抱养的?

我:有可能!

陈:身份证上是谢祥春你就真的是谢祥春吗?

我:?

陈:身份证有没有假的?

我:有,

陈:朋友叫你谢祥春你叫真的是谢祥春吗?

我:不一定!

陈:你有没有可能叫李祥春张祥春呢?

我:有可能!

   要说服别人改变别人的想法就必须让他产生怀疑,让别人产生怀疑的方法就是不断的反问,当别人产生怀疑的时候你再给他一个新的概念和观点并不断的加强最后就会形成他新的信念信念建立的条件有:一.成长的环境建立的;.过去的经验中得来的;.学习中得到的;.别人告诉的..突发事件中感悟的;.自己想象出来的;

  比如:有一离婚的妈妈告诉女儿:男人没有好东西, 女儿没谈过恋爱没有体验肯定是不相信的,有一天女儿谈了男朋友,妈妈又告诉她男人没有好东西, 女儿想不会吧?不久,男朋友把她给摔了, 于是女儿想:妈妈说的是对的,男人没有好东西,后来有一男孩子又开始追求女儿, 女儿却不敢冒然行使,经不住男孩子的强大攻势女儿又开始谈恋爱了,没谈多久又分手了, 女儿终于相信妈妈说的是事实了,她也坚信男人没有好东西。这就是女儿信念的建立过程,每个人只所以不能认同你就是有自己的信念在支撑他,不管是从哪里得来的。如何解除和转换女儿呢?那就是不断的问,

问:你为什么会认为男人没有好东西呢?

女儿:妈妈告诉我的,也是我自己谈了两个男朋友的经验得来的,

问:你认为的坏男人的标准是什么?

女儿:不知道,

问:你妈妈说的就一定是对的吗?

女儿:不一定,

问:你才谈了两个男朋友就一定认为男人没有好东西吗?

女儿:?

问:中国有13亿人,符合你的年龄段的男孩子就算一万个有没有?

女儿:有,

问:两个更多还是一万个更多?

女儿:当然一万更多,

问:有没有可能你谈的两个是坏男人,其余的9998个都是好男人?

女儿:有可能,

问:既然有可能那男人都没有好东西吗?

女儿:。。。。(默认),

建立新信念:不是所有的男人都是坏男人,只不过你还没有碰见好男人,确立好男人的标准,知道自己适合什么样的男人,坚持不懈一定能找到属于你的幸福是吗?

女儿:是的

  在做销售的过程中有许多顾客说:你们的产品不好,价格太贵,又是新公司等等都可以参照上面的说服方法来做:一.了解为什么会有这种想法,是什么原因引起的,.你说的就一定是对的吗?.用成功的案例来证明,.给他一个新概念来转换他,.坚定他的信念;

   比如有人说:我不做销售,销售好辛苦没出席!

:你为什么认为销售好辛苦没出席?

:当然啦!我看到那些销售员象无头苍蝇似的每天到处乱窜,又黑又穷,讨厌死了!

:你未来想成为成功的人是吗?

:是的

:你认为的成功的定义是什么?

:有自己的房子,车子,还有一定的存款,

:怎样才能让自己成为你认为的成功者呢?

:努力工作以后当老板

:努力工作就会成功吗?

:不一定,要方法正确

:你现在有方法吗?

:还没有

:在现在成功的人中有80%的人是做销售出来的,20%是靠专业技术和其他成功的是不是?

:是的

:你有什么让自己成功的专业吗?

:没有

:也就是说你要当老板只能通过做销售来实现是不是?

:是的

:只有做销售才能了解市场,了解销售的步骤和过程,才能以后管理和训练自己的团队是不是?

:是的

:你是想成功还是一定要成功?

:一定要成功

:一定要成功是不是一定要做销售呢?

:是的

:从什么时候开始呢:

:现在

 在我做企业管理,研究成功学以及销售的市场实践中,我发现没有说法不了的人,说服不了别人只能说明你要么知识面不够,要么经验不足,要么方法不对,要么不了解对方的问题,要么不够自信等等都是你的原因,而不是别人的原因;

   再比如:我公司有做网站的服务项目,我们帮顾客设计的网页是红色的,顾客要蓝色的

顾客:怎么是红色的,我要蓝色的

:是吗?为什么不要红色的?

顾客:红色的不好看太显眼

:你做网站的目的是宣传你们公司的产品是不是?

顾客:是的

:那你是想让顾客容易记住还是记不住你?

顾客:当然要容易记住啦

:请问人在看东西的时候是兴奋的时候更容易记住还是平淡的时候容易记住?

顾客:当然兴奋的时候容易记住

:请问红色是不是给人兴奋?蓝色给人安静?

顾客:是的,

:所以用红色更能达到宣传的效果是不是?

顾客:好象是有道理的

 如果顾客要红色的,我们做的是蓝色的又怎样说服呢?

顾客:怎么是蓝色的不是红色的?

:为什么要用红色的呢?

顾客:红色的给人兴奋更容易记住呀

:是吗?我相信你说的是对的,可是红色的容易让人产生视觉疲劳是不是?

顾客:是的

:人们看网站看的是文字而不是颜色是不是?

顾客:是的

:红色把注意力分散了,人们眼睛的注意力转到了颜色而忽视了文字是不是?

顾客:是的

:就象电视机一样,你见过彩色外壳的电视机吗?

顾客:没有

:是因为彩色的容易匡住视线产生视觉疲劳是不是?

顾客:是的

:所以蓝色会比较适合是不是?

顾客:有道理

上面的说服是用事物的优点和缺点来说服的,顾客说优点你就说缺点,同时也告诉我们:80%的顾客是没有主见的,是容易被说服的,只有20%的顾客比较难说服;还告诉我们:做任何销售都是内行赚外行的钱,当顾客都比你懂得多的时候你只有一种结果,就是提着你的东西回家吧!

   说服顾客的方法我的总结是从下面来做:

1.是什么原因?为什么?(找原因)

2.未来要成为什么人?(寻找价值观)

3.未来要过怎样的生活?(寻找价值观)

4.如果做会怎样?(给快乐)

5.不做又会怎样?(给痛苦)

6.成功者是什么样做的(给信念)

7.是想还是一定要(堵借口)

8.什么时候开始(激发行动力)

posted @ 2008-08-11 16:13 toby chen 阅读(362) 评论(0) 编辑

2008年7月24日 #

reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\taskmgr.exe" /f
posted @ 2008-07-24 16:41 toby chen 阅读(302) 评论(0) 编辑

2008年3月7日 #

 用过WebPart的朋友都知道,WebPart的个性化存储是跟ASP.NET2.0系统的membership结合在一起的。但对于我这种来说,因为不是很喜欢那些没有源代码的DLL,所以就需要想办法解决如果不使用membership而又能存储用户在webpart的个性化配置的数据。

想到这里的时候,突然想起很早的时候曾经看到过一篇介绍 WebPart的文章,
http://www.vckbase.com/document/viewdoc/?id=1550(翻译By汪泳)
http://msdn.microsoft.com/msdnmag/issues/05/09/WebParts/default.aspx

文章在最后面提到:创建自己的个性化提供者。通过继承 SqlPersonalizationProvider  类,主要重写里面的LoadPersonalizationBlobs ,SavePersonalizationBlob二个方法,然后在web.config配置中自定义<webpart>元素中的add元素的type特性即可。

posted @ 2008-03-07 11:26 toby chen 阅读(148) 评论(0) 编辑

2008年2月21日 #

Net提供了接口,这个不同于Class或者Struct的类型定义。接口有些情况,看似和抽象类一样,因此有些人认为在.Net可以完全用接口来替换抽象类。其实不然,接口和抽象类各有长处和缺陷,因此往往在应用当中,两者要结合来使用,从而互补长短。
 
接下来先说说抽象类和接口的区别。
区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成”。这些听起来有些虚,举个例子。例如,狗是对于所有狗类动物的统称,京哈是狗,牧羊犬是狗,那么狗的一般特性,都会在京哈,牧羊犬中找到,那么狗相对于京哈和牧羊犬来说,就属于这类事物的抽象类型;而对于“叫”这个动作来说,狗可以叫,鸟也可以叫。很明显,前者相当于所说的是抽象类,而后者指的就是接口。
 
区别二,抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。
例如:
    public abstract class AbsTest
    {
        public virtual void Test()
        {
            Debug.WriteLine( "Test" );
        }
        public abstract void NewTest();
    }
 
    public interface ITest
    {
        void Test();
        void NewTest();
    }
 
区别三,继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。
 
区别四,在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。
 
知道了两者的区别,再来说说,接口相对于抽象类的优势。
好处一,接口不光可以作用于引用类型,也可以作用于值类型。而抽象类来说,只能作用于引用类型。
 
好处二,.Net的类型继承只能是单继承的,也就是说一个类型只能继承一个类型,而可以继承多个接口。其实,我对于这一点也比较赞同,多继承会使继承树变的混乱。
 
好处三,由于接口只是定义属性和方法,而与真正实现的类型没有太大的关系,因此接口可以被多个类型重用。相对于此,抽象类与继承类的关系更紧密些。
 
好处四,通过接口,可以减少类型暴露的属性和方法,从而便于保护类型对象。当一个实现接口的类型,可能包含其他方法或者属性,但是方法返回的时候,可以返回接口对象,这样调用端,只能通过接口提供的方法或者属性,访问对象的相关元素,这样可以有效保护对象的其他元素。
 
好处五,减少值类型的拆箱操作。对于Struct定义的值类型数据,当存放集合当中,每当取出来,都需要进行拆箱操作,这时采用Struct+Interface结合的方法,从而降低拆箱操作。
参看如下文章提供的方法。
http://blog.csdn.net/Knight94/archive/2006/10/08/1326326.aspx
 
相对于抽象类来说,接口有这么多好处,但是接口有一个致命的弱点,就是接口所定义的方法和属性只能相对于继承它的类型(除非在继承类中修改借口定义的函数标示),那么对于多层继承关系的时候,光用接口就很难实现。因为如果让每个类型都去继承接口而进行实现的话,首先不说编写代码比较繁琐,有时候执行的结果还是错误,尤其当子类型对象隐式转换成基类对象进行访问的时候。
那么这时候,需要用接口结合虚方法来实现。参看IDisposable在继承类型中的实现方法。
http://blog.csdn.net/Knight94/archive/2006/10/10/1329214.aspx
 
其实在继承中,到底使用接口还是抽象类。接口是固定的,约定俗成的,因此在继承类中必须提供接口相应的方法和属性的实现。而对于抽象类来说,抽象类的定义方法的实现,贯穿整个继承树,因此其中方法的实现或者重写都是不确定的。因此相对而言,抽象类比接口更灵活一些。
 
如下给出两者的简单对比表格。
  接口 抽象类
多继承 支持 不支持
类型限制 没有 有,只能是引用类型
方法实现 继承类型中必须给出方法实现 继承类中可以不给出
扩展性 比较麻烦 相对比较灵活
多层继承 比较麻烦,需要借助虚函数 比较灵活

 
总的来说,接口和抽象类是.Net为了更好的实现类型之间继承关系而提供的语言手段,而且两者有些相辅相成的关系。因此我并不强调用什么而不用什么,那么问题的关键在于,如何把这两种手段合理的应用到程序当中,这才是至关重要。

该文章转载自网络大本营:http://www.xrss.cn/Dev/DotNet/200792016649.Html

posted @ 2008-02-21 12:02 toby chen 阅读(798) 评论(0) 编辑

Sql Server2005的一个新特性便是我等了很久的Row_Number(),以前用Oracle时用rownumber写分页存储过程很方便:)

下面是我做的一个小小的测试,测试我原来在sql server2000下所用的分页存储过程与使用Row_Number()编写的存储过程在Sql Server2005上的执行效率...

数据表:
REATE TABLE [dbo].[test](
[UserId] [int] Primary Key IDENTITY(1,1) ,
[UserName] [nvarchar](256) ,
[Sex] [varchar](50) NOT NULL,
[Age] [int] NOT NULL,
[Address] [varchar](100) ,
[status] [bit] NULL,
[Email] [varchar](100) ,
[InsertDate] [datetime] NOT NULL

插入1000k记录
use temp
Go

declare @n int
set @n = 0
while @n<1000000
BEGIN
Insert Into test(UserName,Sex,Age,Address,status,Email,InsertDate)
Values('bbisky','男','25','中国传媒大学现代远程教育中心',1,'denghaibo@live.com',getdate())
Select @n = @n+1
END
 


两个存储过程

原来使用Top的分页存储过程
Create proc [dbo].[test_PageById]
(
@pageIndex int,
@pageSize int
)
AS
SELECT TOP(@pageSize) *
FROM test
WHERE UserId <
(SELECT MIN(UserId) FROM (
SELECT TOP ((@pageIndex-1) * @pageSize) UserId
FROM test
ORDER BY UserId DESC)B )
ORDER BY UserId DESC


使用Row_number的存储过程
CREATE proc [dbo].[test_PageByRowNumber]
(
@pageIndex int,
@pageSize int
)
AS
DECLARE @startRow int, @endRow int
Set @startRow = (@pageIndex - 1) * @pageSize +1
SET @endRow = @startRow + @pageSize -1
SELECT*
FROM (
SELECT *,ROW_NUMBER() OVER (ORDER BY UserId DESC) AS RowNumber
FROM test ) T
WHERE T.RowNumber BETWEEN @startRow AND @endRow
 


测试和结果

SET STATISTICS io ON
SET STATISTICS time ON
go
EXEC test_PageByRowNumber 1000,50 --RowNumber存储过程
go
SET STATISTICS profile OFF
SET STATISTICS io OFF
SET STATISTICS time OFF

/*结果分析*/
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

(50 行受影响)
表 'test'。扫描计数 1,逻辑读取 50098 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

SQL Server 执行时间:
CPU 时间 = 219 毫秒,占用时间 = 213 毫秒。

SQL Server 执行时间:
CPU 时间 = 219 毫秒,占用时间 = 213 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

 


 
SET STATISTICS io ON
SET STATISTICS time ON
go
EXEC test_PageById 1000,50 --执行使用top语句的存储过程
go
SET STATISTICS profile OFF
SET STATISTICS io OFF
SET STATISTICS time OFF

/*结果分析*/
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

(50 行受影响)
表 'test'。扫描计数 2,逻辑读取 153 次,物理读取 0 次,预读 93 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

SQL Server 执行时间:
CPU 时间 = 16 毫秒,占用时间 = 26 毫秒。

SQL Server 执行时间:
CPU 时间 = 16 毫秒,占用时间 = 26 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。至此可以很直观的看出差距了.使用原来的Top子句的存储过程比使用Row_Number()的存储过程执行时间快了将近10倍.....

其实直接分析语句也可以看出,Row_Number()的效率不会是最高的,因为它必须先为100万条记条生成RowNumber,自然不会快到哪里去了.

不过前者的适应范围有些限制,即必须有一个为数字的唯一字段,如果使用uniqueidentifier为主键的话则不能使用了.
Row_Number分页有很好的通用性和直观易用性,对于数据量较少来说,二者应该不会有很大的区别,使用哪个就看你自己的需要了.

posted @ 2008-02-21 10:40 toby chen 阅读(870) 评论(0) 编辑

2007年8月3日 #

位运算

  前面介绍的各种运算都是以字节作为最基本位进行的。 但在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能, 这使得C语言也能像汇编语言一样用来编写系统程序。
一、位运算符C语言提供了六种位运算符:
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移

1. 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。
例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。

  按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为0000000011111111)。
main(){
int a=9,b=5,c;
c=a&b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}


2. 按位或运算 按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
例如:9|5可写算式如下: 00001001|00000101
00001101 (十进制为13)可见9|5=13
main(){
int a=9,b=5,c;
c=a|b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}


3. 按位异或运算 按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下: 00001001^00000101 00001100 (十进制为12)
main(){
int a=9;
a=a^15;
printf("a=%d\n",a);
}


4. 求反运算 求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。例如~9的运算为: ~(0000000000001001)结果为:1111111111110110

5. 左移运算 左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,
高位丢弃,低位补0。例如: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。6. 右移运算 右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。 应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。
main(){
unsigned a,b;
printf("input a number: ");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d\tb=%d\n",a,b);
}
请再看一例!
main(){
char a='a',b='b';
int p,c,d;
p=a;
p=(p<<8)|b;
d=p&0xff;
c=(p&0xff00)>>8;
printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}


位域

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:
struct 位域结构名
{ 位域列表 };
其中位域列表的形式为: 类型说明符 位域名:位域长度
例如:
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;

说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:

1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*从下一单元开始存放*/
unsigned c:4
}

在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。

2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。

3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:
struct k
{
int a:1
int :2 /*该2位不能使用*/
int b:3
int c:2
};

从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。

二、位域的使用位域的使用和结构成员的使用相同,其一般形式为: 位域变量名·位域名 位域允许用各种格式输出。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
pbit=&bit;
pbit->a=0;
pbit->b&=3;
pbit->c|=1;
printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
}

上例程序中定义了位域结构bs,三个位域为a,b,c。说明了bs类型的变量bit和指向bs类型的指针变量pbit。这表示位域也是可以使用指针的。
程序的9、10、11三行分别给三个位域赋值。( 应注意赋值不能超过该位域的允许范围)程序第12行以整型量格式输出三个域的内容。第13行把位域变量bit的地址送给指针变量pbit。第14行用指针方式给位域a重新赋值,赋为0。第15行使用了复合的位运算符"&=", 该行相当于: pbit->b=pbit->b&3位域b中原有值为7,与3作按位与运算的结果为3(111&011=011,十进制值为3)。同样,程序第16行中使用了复合位运算"|=", 相当于: pbit->c=pbit->c|1其结果为15。程序第17行用指针方式输出了这三个域的值。

posted @ 2007-08-03 08:47 toby chen 阅读(447) 评论(0) 编辑

2007年6月25日 #

摘要: FTP开通后一般会有一个分配好的密码,如果用户想修改这个密码可以用命令的方式来修改。但并不是每个人都懂得如何使用命令,如果可以提供一个网页,可以让用户自己修改的话那就方便多了。以下的代码主要是通过.net调用微软封装好的wininet.dll动态连接库里面的一些方法来现实修改密码的,这个类还封装了其它的方法,可以应用于其它的网络服务。这些例子也可以做为.net里如何调用windows API函数的...阅读全文
posted @ 2007-06-25 17:48 toby chen 阅读(564) 评论(0) 编辑

2007年5月17日 #

摘要: 今天开始学习UDP协议,因为UDP协议是无连接的协议。因此,为了使服务器应用能够接收到UDP数据包,必须注意两件事:1、创建一个Socket对象2、使创建的套接字和本地的一个端口绑定完成这两件工作后服务器端就可以从指定的端口接收UDP数据包,或者收将数据包发送到指定的设备上。UDP中不使用标准的Send()和Receive()方法,而是使用新的两个方法SendTo()和ReceiveFrom()由...阅读全文
posted @ 2007-05-17 16:23 toby chen 阅读(564) 评论(0) 编辑

摘要: 经过学习,基本上掌握了如何使用TCP套接字发送消息。因为TCP套接字是面向连接的,在数据传输之前,发送和接收的双方都必须建立好连接。数据以数据流的形式发送到远程机器上,因此在TCP会话中消息是没有边界的。在这种使用TCP协议的环境中,不能保护消息的边界,因此在编写网络层的TCP应用时,必须考虑如何识别单个消息。为了解决消息边界问题常用技巧:1、永远发送固定长度的消息2、将消息尺寸与消息一起发送3、...阅读全文
posted @ 2007-05-17 16:22 toby chen 阅读(718) 评论(1) 编辑

2007年5月15日 #

摘要: 服务器端程序:usingSystem;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Collections.Generic;usingSystem.Text;namespacenet{classProgram{staticvoidMain(string[]args){intrecv;byte[]data=newbyte[1024];IPEn...阅读全文
posted @ 2007-05-15 16:48 toby chen 阅读(3400) 评论(1) 编辑