显示下一条  |  关闭

hell的博客

细节决定成败

 
 
 
 
 
 

福建省 福州市 处女座

 发消息  写留言

 
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 

自定义模块

 
 
模块内容加载中...
 
 
 
 
 

天气

 
 
模块内容加载中...
 
 
 
 
 
 
 
心情随笔列表加载中...
 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
 
 
 
 
下载音乐盒  曲目表歌词秀
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 我要留言
 
 
 
留言列表加载中...
 
 
 
 
 
 
 
列表加载中...
 
 
 
 
 
 

网易新闻资讯

 
 
 
 
新闻标题 
列表加载中...
 
 
 
 
 

日志分类

 
 
日志分类列表加载中...
 
 
 
 
 
 
 

linux-rbtree

2011-5-15 11:49:44 阅读59 评论0 152011/05 May15

今天看了下linux源码的rbtree的内容,讲的是红黑树的数据结构,红黑树的知识在网上很多地方都有介绍,这里就不说了。另我感到奇怪的是关于红黑节点的声明:

struct rb_node

{

    unsigned long  rb_parent_color;/* 这里只有这个属性,并没有单独的parent及color属性 */

#define    RB_RED        0

#define    RB_BLACK    1

    struct rb_node *rb_right;

    struct rb_node *rb_left;

} __attribute__((aligned(sizeof(long))));

刚看到这个声明的时候感到很奇怪,父节点及color的声明跑哪去?这个rb_parent_color又是干什么?看到如下的操作时:

#define rb_parent(r)   ((struct rb_node *)((r)->rb_parent_color & ~3))

#define rb_color(r)   ((r)->rb_parent_color & 1)

作者  | 2011-5-15 11:49:44 | 阅读(59) |评论(0) | 阅读全文>>

n&(n-1)的妙用

2011-4-28 21:54:56 阅读20 评论0 282011/04 Apr28

今天无聊拿起《编程之美》看了下,发现原来n&(n-1)还有很多妙用。

n&(n-1)作用:将n的二进制表示中的最低位为1的改为0,先看一个简单的例子:

n = 10100(二进制),则(n-1) = 10011 ==》n&(n-1) = 10000

可以看到原本最低位为1的那位变为0。

弄明白了n&(n-1)的作用,那它有哪些应用?

1. 求某一个数的二进制表示中1的个数

while (n >0 ) {

      count ++;

      n &= (n-1);

}

2. 判断一个数是否是2的方幂

n > 0 && ((n & (n - 1)) == 0 )

3. 计算N!的质因数2的个数。

容易得出N!质因数2的个数 = [N / 2] + [N / 4] + [N / 8] + ....

下面通过一个简单的例子来推导一下过程:N = 10101(二进制表示)

现在我们跟踪最高位的1,不考虑其他位假定为0,

则在

[N / 2]    01000

[N / 4]    00100

作者  | 2011-4-28 21:54:56 | 阅读(20) |评论(0) | 阅读全文>>

索引器

2011-4-25 21:28:35 阅读12 评论0 252011/04 Apr25

和属性类似,不过属性提供的是如同访问公共字段的访问方式,而索引器提供的是类似于访问公共字段数组的访问方式,能以数组的索引来访问私有的数组字段。和属性一样需要get和set访问器。

class SampleCollection<T>

{

    private T[] arr = new T[100];

    public T this[int i]

    {

        get

        {

            return arr[i];

        }

        set

        {

            arr[i] = value;

        }

    }

}

// This class shows how client code uses the indexer

class Program

{

    static void Main(string[] args)

    {

        SampleCollection<string> stringCollection = new SampleCollection<string>();

        stringCollection[0] = "Hello, World";

  

作者  | 2011-4-25 21:28:35 | 阅读(12) |评论(0) | 阅读全文>>

属性

2011-4-25 21:19:19 阅读10 评论0 252011/04 Apr25

C#属性的概念是来自于VB#。它提供了一种如同访问公共字段地访问私有字段的方法。其中要定义所要访问的私有字段和get,set访问器。

public class Date

{

    private int month = 7;  //"backing store"

public int Month

    {

        get

        {

            return month;

        }

        set

        {

            if ((value > 0) && (value < 13))

            {

                month = value;

            }

        }

    }

}

不具有get访问器的属性可视为只写属性,而不具有set访问器的属性视为只读属性。其中,set访问器中有一个默认值为value。

属性的使用方法:

Date d1 = new Date();

d1.Month = 11;

使用的形式如前面所讲,和公共字段的使用方法类似。

作者  | 2011-4-25 21:19:19 | 阅读(10) |评论(0) | 阅读全文>>

装箱与取消装箱

2011-4-24 16:09:40 阅读14 评论0 242011/04 Apr24

装箱:装箱是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。

int i = 123;

object o = (object) i;  // explicit boxing

取消装箱:就是装箱的反过程。

检查对象实例,确保它是给定值类型的一个装箱值。

将该值从实例复制到值类型变量中。

int i = 123;      // a value type

object o = i;     // boxing

int j = (int) o;  // unboxing

如果对null或不不兼容值类型的引用进行取消装箱操作,将导致 InvalidCastException。

作者  | 2011-4-24 16:09:40 | 阅读(14) |评论(0) | 阅读全文>>

C#数据类型

2011-4-24 15:58:15 阅读20 评论0 242011/04 Apr24

C#的数据类型根据存储方式分为两类:值类型和引用类型。

 值类型。和其他语言一样,值类型也是直接存储其值,存储在堆栈中。一般来说,C#的值类型主要分为两类:结构:结构包括了我们通常所用到的简单数据类型如int等,还有用户自己定义的结构。枚举:和C语言中的概念一致。所有的值类型都隐式派生自 System.ValueType,并且不能派生出新类型。

每一个值类型都有一个默认的构造函数用来初始值。和C语言不同的是,值类型要显示的使用new或等价的形式如(=)来初始化值才能使用:

int myInt;

myInt = new int();  // Invoke default constructor for int type.



myInt = 0;         // Assign an initial value, 0 in this example.

之前的int myInt并未进行初始化。

2.   引用类型。引用类型的值存储在托管堆中,主要包括了三种引用类型:

class:类interface:接口delegate:委托

作者  | 2011-4-24 15:58:15 | 阅读(20) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2012

   
创建博客 登录  
 关注