随笔 - 141  文章 - 0  评论 - 31 
  2011年4月15日

SQL 智能提示工具

已前写SQL语句的时候一直是手写的。最近看到同事写SQL时有提示,于是我就google一下,找了个SQL智能提示工具。

真是的满好的。

SQL 2008默认就有了智能提示,可是我用的SQL 2005所以没办法

就去网上找了Sql Prompt 3.9

因为这个是收费软件,所以得破解

正版下载

破解文件

 

先安装正版

 

把破解版所有文件覆盖到正式版的安装目录。在点击“RedGate.SQLPrompt.reg”进行软件注册。到此破解工作已经全部完成。然后打开MSSQL2005可以使用了。 
 
 
还可以下载一个 小插件工具 sql assistant
 
 
posted @ 2011-04-15 11:42 poop 阅读(82) 评论(0) 编辑
  2011年4月2日

  Oracle自定义聚集函数 收藏 此文于2011-04-01被推荐到CSDN首页
如何被推荐?
节选自《剑破冰山——oracle 开发艺术》一书,书籍销售地址:ITPUB个人空间)up/K(j8tJx|O"~5J
http://product.china-pub.com/197199ITPUB个人空间s] c3^'dw5}T.M6W
http://product.dangdang.com/product.aspx?product_id=20981228&ref=book-02-L
n~Cwq&{+E6517 http://www.amazon.cn/mn/detailApp?uid=477-1785695-2022958&ref=RK&asin=B004CMIVM6

自定义聚集函数
自定义聚集函数接口简介
Oracle 提供了很多预定义好的聚集函数,比如Max(), Sum(), AVG() , 但是这些预定义的聚集函数基本上都是适应于标量数据(scalar data ) , 对于复杂的数据类型,比如说用户自定义的Object type, Clob 等, 是不支持的。

但是,幸运的是, 用户可以通过实现Oracle 的Extensibility Framework 中的ODCIAggregate interface 来创建自定义聚集函数,而且自定义的聚集函数跟内建的聚集函数用法上没有差别。

通过实现ODCIAggregate rountines 来创建自定义的聚集函数。可以通过定义一个对象类型(Object Type ),然后在这个类型内部实现ODCIAggregate 接口函数(routines) , 可以用任何一种Oracle 支持的语言来实现这些接口函数,比如C/C++, JAVA, PL/SQL 等。在这个Object Type 定义之后,相应的接口函数也都在该Object Type Body 内部实现之后, 就可以通过CREATE FUNCTION 语句来创建自定义的聚集函数了。

每个自定义的聚集函数需要实现4 个ODCIAggregate 接口函数, 这些函数定义了任何一个聚集函数内部需要实现的操作,这些函数分别是initialization, iteration, merging 和termination 。

 

a. static function ODCIAggregateInitialize(sctx IN OUTstring_agg_type ) return number

    自定义聚集函数初始化操作, 从这儿开始一个聚集函数。初始化的聚集环境(aggregation context) 会以对象实例(object type instance) 传回给oracle.

b. member function ODCIAggregateIterate(self IN OUT string_agg_type ,value IN varchar2) return number

    自定义聚集函数, 最主要的步骤, 这个函数定义我们的聚集函数具体做什么操作, 后面的例子, 是取最大值, 最小值, 平均值, 还是做连接操作.self 为当前聚集函数的指针, 用来与前面的计算结果进行关联

    这个函数用来遍历需要处理的数据,被oracle 重复调用。每次调用的时候,当前的aggreation context 和 新的(一组)值会作为传入参数。 这个函数会处理这些传入值,然后返回更新后的aggregation context. 这个函数对每一个NON-NULL 的值都会被执行一次。NULL 值不会被传递个聚集函数。

c. member function ODCIAggregateMerge (self IN string_agg_type,returnValue OUT  varchar2,flags IN number) return number

    用来合并两个聚集函数的两个不同的指针对应的结果, 用户合并不同结果结的数据, 特别是处理并行(parallel) 查询聚集函数的时候.

    这个函数用来把两个aggregation context 整合在一起,一般用来并行计算中(当一个函数被设置成enable parallel 处理的时候)。

d. member function OCDIAggregateTerminate(self IN string_agg_type,returnValue OUT varchar2,flags IN number)

     终止聚集函数的处理, 返回聚集函数处理的结果.

    这个函数是Oracle 调用的最后一个函数。它接收aggregation context 作为参数,返回最后的aggregate value.  

应用场景一:字符串聚集
CREATE OR REPLACE TYPE typ_concatenate_impl AS OBJECT

(

    retstr VARCHAR2(30000),      -- 拼凑使用的中间字符串

    SEPARATORFLAG  VARCHAR2(64), -- 分隔符,默认用自由定义| ,可以修改此处

    STATIC FUNCTION ODCIAGGREGATEINITIALIZE(sctx IN OUT typ_concatenate_impl) RETURN NUMBER,

    MEMBER FUNCTION ODCIAGGREGATEITERATE(self IN OUT typ_concatenate_impl, value IN VARCHAR2) RETURN NUMBER,

    MEMBER FUNCTION ODCIAGGREGATETERMINATE(self IN typ_concatenate_impl, returnvalue OUT VARCHAR2, flags IN NUMBER) RETURN NUMBER,

    MEMBER FUNCTION ODCIAGGREGATEMERGE(self IN OUT typ_concatenate_impl, ctx2 IN typ_concatenate_impl) RETURN NUMBER

)

/

CREATE OR REPLACE TYPE BODY typ_concatenate_impl IS

    -- 自定义聚集函数初始化操作

    STATIC FUNCTION ODCIAGGREGATEINITIALIZE(sctx IN OUT typ_concatenate_impl) RETURN NUMBER IS

    BEGIN

        sctx := typ_concatenate_impl('',',');

        RETURN ODCICONST.SUCCESS;

    END;

    -- 定义函数的功能,实现字符串拼接

    MEMBER FUNCTION ODCIAGGREGATEITERATE(self IN OUT typ_concatenate_impl, value IN VARCHAR2) RETURN NUMBER IS

    BEGIN

        self.retstr := self.retstr || value||self.SEPARATORFLAG;

        RETURN ODCICONST.SUCCESS;

    END;

    -- 定义终止聚集函数的处理, 返回聚集函数处理的结果

    MEMBER FUNCTION ODCIAGGREGATETERMINATE(self IN typ_concatenate_impl, returnvalue OUT VARCHAR2, FLAGS IN NUMBER)

    RETURN NUMBER IS

    BEGIN

        IF returnvalue IS NOT NULL THEN

            returnvalue := SUBSTR(self.retstr,1,LENGTH(self.retstr)-1);

        ELSE

             returnvalue := self.retstr;

        END IF;

        RETURN ODCICONST.SUCCESS;

    END;

    -- 用来合并两个聚集函数的两个不同的指针对应的结果,此处默认即可

    MEMBER FUNCTION ODCIAGGREGATEMERGE(self IN OUT typ_concatenate_impl, ctx2 IN typ_concatenate_impl) RETURN NUMBER IS

    BEGIN

        RETURN ODCICONST.SUCCESS;

    END;

END;

/

 

-- 创建自定义函数

CREATE OR REPLACE FUNCTION f_concatenate_str(i_str VARCHAR2) RETURN VARCHAR2

    AGGREGATE USING typ_concatenate_impl;

/
 

 

    创建测试表和数据,并进行测试

CREATE TABLE TEST (ID NUMBER, NAME VARCHAR2(20));

INSERT INTO TEST VALUES (1, 'AAA');

INSERT INTO TEST VALUES (2, 'BBB');

INSERT INTO TEST VALUES (1, 'ABC');

INSERT INTO TEST VALUES (3, 'CCC');

INSERT INTO TEST VALUES (2, 'DDD');

COMMIT;
 

查看执行后的结果,并与WMSYS.WM_CONCAT 函数执行效果对照。

SQL> SELECT id,f_concatenate_str(name) name FROM test GROUP BY id;          

        ID NAME

---------- ------------------------------------------------------------------

         1 AAA,ABC,

         2 BBB,DDD,

         3 CCC,

 

SQL> SELECT id,wmsys.wm_concat(name) name FROM test GROUP BY id;

        ID NAME

---------- ------------------------------------------------------------------

         1 AAA,ABC

         2 BBB,DDD

         3 CCC

 

SQL> SELECT id,f_concatenate_str(name) OVER (PARTITION BY id) name FROM test;

        ID NAME

---------- ------------------------------------------------------------------

         1 AAA,ABC,

         1 AAA,ABC,

         2 DDD,BBB,

         2 DDD,BBB,

         3 CCC,

 

SQL> SELECT id,wmsys.wm_concat(name) OVER (PARTITION BY id) name FROM test;

        ID NAME

---------- ------------------------------------------------------------------

         1 AAA,ABC

         1 AAA,ABC

         2 DDD,BBB

         2 DDD,BBB

         3 CCC
 

   

实际上在Oracle10g 版本中提供了一个未文档化的函数 wmsys.wm_concat() ,也可以实现字符串的聚集拼接;这两个函数异曲同工。

    这也说明Oracle 提供的聚集函数已足够强大,想发明不重复的轮子还是很困难的


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/baoqiangwang/archive/2011/03/31/6293004.aspx

posted @ 2011-04-02 09:47 poop 阅读(45) 评论(0) 编辑
  2010年12月24日

二进制、八进制、十进制、十六进制之间转换

一、 十进制与二进制之间的转换
(1) 十进制转换为二进制,分为整数部分和小数部分
① 整数部分
方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。下面举例:
例:将十进制的168转换为二进制

得出结果 将十进制的168转换为二进制,(10101000)2
分析:第一步,将168除以2,商84,余数为0。
第二步,将商84除以2,商42余数为0。
第三步,将商42除以2,商21余数为0。
第四步,将商21除以2,商10余数为1。
第五步,将商10除以2,商5余数为0。
第六步,将商5除以2,商2余数为1。
第七步,将商2除以2,商1余数为0。
第八步,将商1除以2,商0余数为1。
第九步,读数,因为最后一位是经过多次除以2才得到的,因此它是最高位,读数字从最后的余数向前读,即10101000

(2) 小数部分
方法:乘2取整法,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到小数部分
为零为止。如果永远不能为零,就同十进制数的四舍五入一样,按照要求保留多少位小数时,就根据后面一位是0还是1,取舍,如果是零,舍掉,如果是1,向入一位。换句话说就是0舍1入。读数要从前面的整数读到后面的整数,下面举例:
例1:将0.125换算为二进制

得出结果:将0.125换算为二进制(0.001)2
分析:第一步,将0.125乘以2,得0.25,则整数部分为0,小数部分为0.25;
第二步, 将小数部分0.25乘以2,得0.5,则整数部分为0,小数部分为0.5;
第三步, 将小数部分0.5乘以2,得1.0,则整数部分为1,小数部分为0.0;
第四步,读数,从第一位读起,读到最后一位,即为0.001。


例2,将0.45转换为二进制(保留到小数点第四位)


大家从上面步骤可以看出,当第五次做乘法时候,得到的结果是0.4,那么小数部分继续乘以2,得0.8,0.8又乘以2的,到1.6这样一直乘下去,最后不可能得到小数部分为零,因此,这个时候只好学习十进制的方法进行四舍五入了,但是二进制只有0和1两个,于是就出现0舍1入。这个也是计算机在转换中会产生误差,但是由于保留位数很多,精度很高,所以可以忽略不计。
那么,我们可以得出结果将0.45转换为二进制约等于0.0111
上面介绍的方法是十进制转换为为二进制的方法,需要大家注意的是:
1) 十进制转换为二进制,需要分成整数和小数两个部分分别转换
2) 当转换整数时,用的除2取余法,而转换小数时候,用的是乘2取整法
3) 注意他们的读数方向
因此,我们从上面的方法,我们可以得出十进制数168.125转换为二进制为10101000.001,或者十进制数转换为二进制数约等于10101000.0111。

(3) 二进制转换为十进制 不分整数和小数部分
方法:按权相加法,即将二进制每位上的数乘以权,然后相加之和即是十进制数。例
将二进制数101.101转换为十进制数。

得出结果:(101.101)2=(5.625)10
大家在做二进制转换成十进制需要注意的是
1) 要知道二进制每位的权值
2) 要能求出每位的值


二、 二进制与八进制之间的转换
首先,我们需要了解一个数学关系,即23=8,24=16,而八进制和十六进制是用这
关系衍生而来的,即用三位二进制表示一位八进制,用四位二进制表示一位十六进制数。
接着,记住4个数字8、4、2、1(23=8、22=4、21=2、20=1)。现在我们来练习二进制与八进制之间的转换。
(1) 二进制转换为八进制
方法:取三合一法,即从二进制的小数点为分界点,向左(向右)每三位取成一位,接着将这三位二进制按权相加,得到的数就是一位八位二进制数,然后,按顺序进行排列,小数点的位置不变,得到的数字就是我们所求的八进制数。如果向左(向右)取三位后,取到最高(最低)位时候,如果无法凑足三位,可以在小数点最左边(最右边),即整数的最高位(最低位)添0,凑足三位。例
①将二进制数101110.101转换为八进制

得到结果:将101110.101转换为八进制为56.5

② 将二进制数1101.1转换为八进制

得到结果:将1101.1转换为八进制为15.4

(2) 将八进制转换为二进制
方法:取一分三法,即将一位八进制数分解成三位二进制数,用三位二进制按权相加去凑这位八进制数,小数点位置照旧。例:
① 将八进制数67.54转换为二进制

因此,将八进制数67.54转换为二进制数为110111.101100,即110111.1011
大家从上面这道题可以看出,计算八进制转换为二进制
首先,将八进制按照从左到右,每位展开为三位,小数点位置不变
然后,按每位展开为22,21,20(即4、2、1)三位去做凑数,即a×22+ b×21 +c×20=该位上的数(a=1或者a=0,b=1或者b=0,c=1或者c=0),将abc排列就是该位的二进制数
接着,将每位上转换成二进制数按顺序排列
最后,就得到了八进制转换成二进制的数字。
以上的方法就是二进制与八进制的互换,大家在做题的时候需要注意的是
1) 他们之间的互换是以一位与三位转换,这个有别于二进制与十进制转换
2) 大家在做添0和去0的时候要注意,是在小数点最左边或者小数点的最右边(即整数的最高位和小数的最低位)才能添0或者去0,否则将产生错误

三、 二进制与十六进制的转换
方法:与二进制与八进制转换相似,只不过是一位(十六)与四位(二进制)的转换,下面具体讲解
(1) 二进制转换为十六进制
方法:取四合一法,即从二进制的小数点为分界点,向左(向右)每四位取成一位,接着将这四位二进制按权相加,得到的数就是一位十六位二进制数,然后,按顺序进行排列,小数点的位置不变,得到的数字就是我们所求的十六进制数。如果向左(向右)取四位后,取到最高(最低)位时候,如果无法凑足四位,可以在小数点最左边(最右边),即整数的最高位(最低位)添0,凑足四位。
①例:将二进制11101001.1011转换为十六进制

得到结果:将二进制11101001.1011转换为十六进制为E9.B


② 例:将101011.101转换为十六进制

因此得到结果:将二进制101011.101转换为十六进制为2B.A



(2)将十六进制转换为二进制
方法:取一分四法,即将一位十六进制数分解成四位二进制数,用四位二进制按权相加去凑这位十六进制数,小数点位置照旧。
①将十六进制6E.2转换为二进制数

因此得到结果:将十六进制6E.2转换为二进制为01101110.0010即110110.001

四、八进制与十六进制的转换
方法:一般不能互相直接转换,一般是将八进制(或十六进制)转换为二进制,然后再将二进制转换为十六进制(或八进制),小数点位置不变。那么相应的转换请参照上面二进制与八进制的转换和二进制与十六进制的转


五、八进制与十进制的转换
(1)八进制转换为十进制
方法:按权相加法,即将八进制每位上的数乘以位权,然后相加之和即是十进制数。
例:①将八进制数67.35转换为十进制

(2)十进制转换为八进制
十进制转换成八进制有两种方法:
1)间接法:先将十进制转换成二进制,然后将二进制又转换成八进制
2)直接法:前面我们讲过,八进制是由二进制衍生而来的,因此我们可以采用与十进制转换为二进制相类似的方法,还是整数部分的转换和小数部分的转换,下面来具体讲解一下:
①整数部分
方法:除8取余法,即每次将整数部分除以8,余数为该位权上的数,而商继续除以8,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数起,一直到最前面的一个余数。
②小数部分
方法:乘8取整法,即将小数部分乘以8,然后取整数部分,剩下的小数部分继续乘以8,然后取整数部分,剩下的小数部分又乘以8,一直取到小数部分为零为止。如果永远不能为零,就同十进制数的四舍五入一样,暂取个名字叫3舍4入。
例:将十进制数796.703125转换为八进制数
解:先将这个数字分为整数部分796和小数部分0.703125
整数部分

小数部分

因此,得到结果十进制796.703125转换八进制为1434.55
上面的方法大家可以验证一下,你可以先将十进制转换,然后在转换为八进制,这样看得到的结果是否一样

六、十六进制与十进制的转换
十六进制与八进制有很多相似之处,大家可以参照上面八进制与十进制的转换自己试试这两个进制之间的转换。
通过上面对各种进制之间的转换,我们可以将前面的转换图重新完善一下:


本文介绍了二进制、十进制、八进制、十六进制四种进制之间相互的转换,大家在转换的时候要注意转换的方法,以及步骤,特别是十进制转换为期于三种进制之间,要分为整数部分和小数部分,最后就是小数点的位置。但是要保证考试中不出现错误还是需要大家经常练习,这样才能熟能生巧。
posted @ 2010-12-24 17:20 poop 阅读(35) 评论(0) 编辑

C语言位运算详解
位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作
运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。
C语言提供的位运算符列表:
运算符 含义 描述
& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1
^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1
~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<< 左移 用来将一个数的各二进制位全部左移N位,右补0
>> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0
1、“按位与”运算符(&)
    按位与是指:参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,
则该位的结果值为1;否则为0。这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。按位与其
实与逻辑上“与”的运算规则一致。逻辑上的“与”,要求运算数全真,结果才为真。若,
A=true,B=true,则A∩B=true 例如:3&5 3的二进制编码是11(2)。(为了区分十进制和其他进制,本文规
定,凡是非十进制的数据均在数据后面加上括号,括号中注明其进制,二进制则标记为2)内存储存数据
的基本单位是字节(Byte),一个字节由8个位(bit)所组成。位是用以描述电脑数据量的最小单位。二
进制系统中,每个0或1就是一个位。将11(2)补足成一个字节,则是00000011(2)。5的二进制编码是
101(2),将其补足成一个字节,则是00000101(2)
按位与运算:
 00000011(2)
&00000101(2)
 00000001(2)
由此可知3&5=1
c语言代码:
#include <stdio.h>
main()
{
 int a=3;
 int b = 5;
 printf("%d",a&b);
}
按位与的用途:
(1)清零
若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:
原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。
例:原数为43,即00101011(2),另找一个数,设它为148,即10010100(2),将两者按位与运算:
 00101011(2)
&10010100(2)
 00000000(2)
c语言源代码:
#include <stdio.h>
main()
{
 int a=43;
 int b = 148;
 printf("%d",a&b);
}
(2)取一个数中某些指定位
若有一个整数a(2byte),想要取其中的低字节,只需要将a与8个1按位与即可。
a 00101100 10101100
b 00000000 11111111
c 00000000 10101100
(3)保留指定位:
与一个数进行“按位与”运算,此数在该位取1.
例如:有一数84,即01010100(2),想把其中从左边算起的第3,4,5,7,8位保留下来,运算如下:
 01010100(2)
&00111011(2)
 00010000(2)
即:a=84,b=59
    c=a&b=16
c语言源代码:
#include <stdio.h>
main()
{
 int a=84;
 int b = 59;
 printf("%d",a&b);
}
2、“按位或”运算符(|)
两个相应的二进制位中只要有一个为1,该位的结果值为1。借用逻辑学中或运算的话来说就是,一真为真

例如:60(8)|17(8),将八进制60与八进制17进行按位或运算。
 00110000
|00001111
 00111111
c语言源代码:
#include <stdio.h>
main()
{
 int a=060;
 int b = 017;
 printf("%d",a|b);
}
应用:按位或运算常用来对一个数据的某些位定值为1。例如:如果想使一个数a的低4位改为1,则只需要
将a与17(8)进行按位或运算即可。
3、“异或”运算符(^)
他的规则是:若参加运算的两个二进制位值相同则为0,否则为1
即0∧0=0,0∧1=1,1∧0=1, 1∧1=0
    例:   00111001
        ∧ 00101010
           00010011
c语言源代码:
#include <stdio.h>
main()
{
 int a=071;
 int b = 052;
 printf("%d",a^b);
}
应用:
(1)使特定位翻转
设有数01111010(2),想使其低4位翻转,即1变0,0变1.可以将其与00001111(2)进行“异或”运算,
即:
 01111010
^00001111
 01110101
运算结果的低4位正好是原数低4位的翻转。可见,要使哪几位翻转就将与其进行∧运算的该几位置为1
即可。
(2)与0相“异或”,保留原值
例如:012^00=012
        00001010
       ^00000000
        00001010
因为原数中的1与0进行异或运算得1,0^0得0,故保留原数。
(3) 交换两个值,不用临时变量
例如:a=3,即11(2);b=4,即100(2)。
想将a和b的值互换,可以用以下赋值语句实现:
    a=a∧b;
    b=b∧a;
    a=a∧b;
a=011(2)
    (∧)b=100(2)
a=111(2)(a∧b的结果,a已变成7)
    (∧)b=100(2)
b=011(2)(b∧a的结果,b已变成3)
    (∧)a=111(2)

a=100(2)(a∧b的结果,a已变成4)
等效于以下两步:
    ① 执行前两个赋值语句:“a=a∧b;”和“b=b∧a;”相当于b=b∧(a∧b)。
    ② 再执行第三个赋值语句: a=a∧b。由于a的值等于(a∧b),b的值等于(b∧a∧b),
因此,相当于a=a∧b∧b∧a∧b,即a的值等于a∧a∧b∧b∧b,等于b。
很神奇吧!
c语言源代码:
#include <stdio.h>
main()
{
 int a=3;
 int b = 4;
 a=a^b;
 b=b^a;
 a=a^b;
 printf("a=%d b=%d",a,b);
}
4、“取反”运算符(~)
他是一元运算符,用于求整数的二进制反码,即分别将操作数各二进制位上的1变为0,0变为1。
例如:~77(8)
源代码:
#include <stdio.h>
main()
{
 int a=077;
 printf("%d",~a);
}
5、左移运算符(<<)
左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负
值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。
例如:将a的二进制数左移2位,右边空出的位补0,左边溢出的位舍弃。若a=15,即00001111(2),左移2
位得00111100(2)。
源代码:
#include <stdio.h>
main()
{
 int a=15;
 printf("%d",a<<2);
}
左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4,15<<2=60,即乘了4。但此结论只适用于该
数左移时被溢出舍弃的高位中不包含1的情况。
    假设以一个字节(8位)存一个整数,若a为无符号整型变量,则a=64时,左移一位时溢出的是0
,而左移2位时,溢出的高位中包含1。
6、右移运算符(>>)
右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负
值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,某些机器将对左边空出的部分
用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。注
意:对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移
入0。如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的
系统移入1。移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。
例: a的值是八进制数113755:
   a:1001011111101101 (用二进制形式表示)
   a>>1: 0100101111110110 (逻辑右移时)
   a>>1: 1100101111110110 (算术右移时)
   在有些系统中,a>>1得八进制数045766,而在另一些系统上可能得到的是145766。Turbo C和其他一些C
编译采用的是算术右移,即对有符号数右移时,如果符号位原来为1,左面移入高位的是1。
源代码:
#include <stdio.h>
main()
{
 int a=0113755;
 printf("%d",a>>1);
}
7、位运算赋值运算符
位运算符与赋值运算符可以组成复合赋值运算符。
   例如: &=, |=, >>=, <<=, ∧=
   例:  a & = b相当于 a = a & b
         a << =2相当于a = a << 2

posted @ 2010-12-24 16:53 poop 阅读(31) 评论(0) 编辑
  2010年12月2日
代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    
<title>无标题页</title>

    
    
<script language="javascript" type="text/javascript">
    
     function countdown() 
     {
            var zero 
= ["000","00","0",""];//差位补零
            var p 
= 100;
            var div 
= document.getElementById("div");
            var inter 
= setInterval(function() {
                
if (p == 0) {
                    window.clearInterval(inter);
                }
                div.innerHTML 
= "还有" + zero[("" + p).length] + p + "";
                p
--;
            }, 
1000);
     }

    
var nMS = 100;
function GetRTime()
{
   

    
if (nMS<10) nMS = "00"+ nMS;
    
else if (nMS<100) nMS = "0"+ nMS;
    document.getElementById(
"RemainS").innerHTML = nMS;
    
if(nMS==0) window.location.href = "2.html";
    
else {
        nMS 
-= 1;
        setTimeout(
"GetRTime()",1000);
    }
}
window.onload
=countdown;


</script>


</head>

<body onload="countdown();">
<div id="CountMsg">还有 <strong id="RemainS"></strong></div>
<div id="div"></div>
</body>
</html>

 

 

setTimeout 和 setInterval 的区别

Posted on 2008-02-18 21:48 小y 阅读(1709) 评论(0) 编辑 收藏 所属分类: [05] Html&CSS&Js相关

setTimeout (表达式,延时时间)
setInterval(表达式,交互时间)
延时时间/交互时间是以豪秒为单位的(1000ms=1s)

setTimeout   在执行时,是在载入后延迟指定时间后,去执行一次表达式,仅执行一次
setInterval 在执行时,它从载入后,每隔指定的时间就执行一次表达式

set Timeout 也可以实现象setInterval一样的功能
set Timeout:
<script language="javascript">
var i;
i=0;
function reloop()
{
i=i+1;
alert(String(i));
setTimeout("reloop()",1000);
}
reloop();
</script>

setInterval:
<script language="javascript">
var i;
i=0;
function reloop()
{
i=i+1;
alert(String(i));
}
setInterval("reloop()",1000);
</script>

window对象有两个主要的定时方法,分别是setTimeout 和 setInteval     他们的语法基本上相同,但是完成的功能取有区别。

  setTimeout方法是定时程序,也就是在什么时间以后干什么。干完了就拉倒。

  setInterval方法则是表示间隔一定时间反复执行某操作。

  如果用setTimeout实现setInerval的功能,就需要在执行的程序中再定时调用自己才行。如果要清除计数器需要 根据使用的方法不同,调用不同的清除方法:

例如:tttt=setTimeout(@#northsnow()@#,1000);

clearTimeout(tttt);

或者:

tttt=setInterval(@#northsnow()@#,1000);

clearInteval(tttt);

举一个例子:

<div id="liujincai"></div>
<input type="button" name="start" value="start" onclick=@#startShow();@#>
<input type="button" name="stop" value="stop" onclick="stop();">
<script language="javascript">
      var intvalue=1;
      var timer2=null;
      function startShow()
      {
         liujincai.innerHTML=liujincai.innerHTML + "&nbsp;" + (intvalue ++).toString();
         timer2=window.setTimeout("startShow()",2000);
      }
      function stop()
      {
         window.clearTimeout(timer2);
      }
</script>

 

posted @ 2010-12-02 15:18 poop 阅读(40) 评论(0) 编辑
posted @ 2010-12-02 09:26 poop 阅读(24) 评论(0) 编辑
  2010年11月9日
摘要: 设置内存选项:SQL code 使用文件及文件组.sql:SQL code 调整tempdb数据库的文件属性.sql:SQL code 日期概念理解中的一些测试.sql:SQL code #1楼 得分:0回复于:2009-04-10 16:22:23CONVERT在日期转换中的使用示例.sql:SQL code SET DATEFORMAT对日期处理的影响.sqlSQL code SET LAN...阅读全文
posted @ 2010-11-09 15:32 poop 阅读(54) 评论(0) 编辑
  2010年10月19日
摘要: 一.powerdesiner的自增长列1.如果dbms是MsSql,则选定表后,database-> edit current dbms-> 出现DBMS properties对话框,选择General页,左侧的树选择SQL 2000-> Profile-> Column-> Extended Attributes 下面的ExtIdentityIncrement是步进...阅读全文
posted @ 2010-10-19 10:34 poop 阅读(165) 评论(0) 编辑
  2010年10月15日
摘要: using System;using System.Collections;using System.Configuration;using System.Data;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.W...阅读全文
posted @ 2010-10-15 15:45 poop 阅读(27) 评论(0) 编辑
  2010年9月14日
摘要: ORACLE中如何查询“表”的主键字段?1、查找表的所有索引(包括索引名,类型,构成列): select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and t.table_name = i.table_name and t.table_n...阅读全文
posted @ 2010-09-14 14:50 poop 阅读(134) 评论(0) 编辑