Chinaunix

标题: 求救怎样可以得到一个unsigned long类型对象的实际占用位数? [打印本页]

作者: super00tiger    时间: 2007-04-25 18:34
标题: 求救怎样可以得到一个unsigned long类型对象的实际占用位数?
求救怎样可以得到一个unsigned long类型对象的实际占用位数?

一个unsigned long 占32位,假如定义一个unsigned long

unsigned long un=260;
则这个un实际只占9位,求救怎样才能判断一个unsigned long类型的实际占用位数?
作者: langue    时间: 2007-04-25 18:38
#define BITS_PER_BYTE 8  /* on an i386, this is by default 8 */
#define SIZE_ULONG (sizeof(unsigned long) * BITS_PER_BYTE)
作者: langue    时间: 2007-04-25 18:39
原帖由 super00tiger 于 2007-4-25 18:34 发表
求救怎样可以得到一个unsigned long类型对象的实际占用位数?

一个unsigned long 占32位,假如定义一个unsigned long

unsigned long un=260;
则这个un实际只占9位,求救怎样才能判断一个unsigned long类型 ...


对于 32 位机型,这个 un 应当占用 32 个二进制位。

.
作者: super00tiger    时间: 2007-04-25 18:43
原帖由 langue 于 2007-4-25 18:39 发表


对于 32 位机型,这个 un 应当占用 32 个二进制位。

.



32位机确实占32位,但是一个假若一个unsigned long 只是2的30的次方的话,则高两位为0,实际占30位,我想问的是怎样求出一个unsigned long的实际占位数,即这个例子怎样求出只占30位?

一楼的
sizeof求出的是unsigned long这个类型的实际占位数
作者: MMMIX    时间: 2007-04-25 18:43
原帖由 langue 于 2007-4-25 18:38 发表
#define BITS_PER_BYTE 8  /* on an i386, this is by default 8 */
#define SIZE_ULONG (sizeof(unsigned long) * BITS_PER_BYTE)

这好像不符合楼主的要求。
作者: langue    时间: 2007-04-25 18:46
原帖由 super00tiger 于 2007-4-25 18:43 发表

32位机确实占32位,但是一个假若一个unsigned long 只是2的30的次方的话,则高两位为0,实际占30位,我想问的是怎样求出一个unsigned long的实际占位数,即这个例子怎样求出只占30位?

一楼的
sizeof求出的是unsigned long这个类型的实际占位数


Use bitwise operators.

实际也要占用这么多。你可以这样问:转换成二进制,去掉前边多余的 0,然后有多少位。
实际占用的就是 (sizeof(unsigned long) * BITS_PER_BYTE) 位。

.
作者: MMMIX    时间: 2007-04-25 18:46
原帖由 super00tiger 于 2007-4-25 18:43 发表
32位机确实占32位,但是一个假若一个unsigned long 只是2的30的次方的话,则高两位为0,实际占30位,我想问的是怎样求出一个unsigned long的实际占位数,即这个例子怎样求出只占30位?

自己写代码算。
作者: caijimin    时间: 2007-04-25 18:47
老大,你是不是说32个bit里把前面是0的去掉,看剩下多少位?

自己写个小函数很容易实现
作者: super00tiger    时间: 2007-04-25 18:48
bitwise operators?

应该用哪个?
作者: super00tiger    时间: 2007-04-25 18:48
原帖由 caijimin 于 2007-4-25 18:47 发表
老大,你是不是说32个bit里把前面是0的去掉,看剩下多少位?

自己写个小函数很容易实现



确切的说是我想知道前面几个0,
作者: langue    时间: 2007-04-25 18:50
可以用:位逻辑与
作者: phoneix    时间: 2007-04-26 11:21
你照着改一下就行了:

static void to_bits( unsigned long val, char* str_last )
{
    int i;
    unsigned long = 1;

    for( i = 0; i < sizeof(unsigned long) * CHAR_BIT; ++i, mask <<= 1 )
        *--str_last = val & mask ? '1' : '0';
}




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2