[问题]C下的二进制问题

C、C++和Java语言
回复
黄黄
帖子: 45
注册时间: 2007-04-22 9:09
送出感谢: 0
接收感谢: 0

[问题]C下的二进制问题

#1

帖子 黄黄 » 2007-04-22 9:18

小弟在最近的程序中需要对二进制进行操作,比如,对28位的二进制进行移位,这个28BIT着实让我伤透!!本来想用汇编来解决,但,各位知道它的移植问题,所以放弃.有人能告诉我在C中用"位"(BIT)来进行操作吗?比如一个字符"C",怎么变换成一串可操作的八位的二进制?
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

#2

帖子 eexpress » 2007-04-22 11:55

xxx <<4
就是移位啊。
28位的二进制,不清楚你是怎么定义的,是要求对一个28位的二进制操作,还是有一个28位的二进制的字符串?

4字节就是32位,定义一个4字节的unsigned long DW,(DW&0x0fffffff)<<4。哎,你的移位也没说清楚。
● 鸣学
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
送出感谢: 0
接收感谢: 7 次
联系:

Re: [问题]C下的二进制问题

#3

帖子 BigSnake.NET » 2007-04-22 12:32

黄黄 写了:小弟在最近的程序中需要对二进制进行操作,比如,对28位的二进制进行移位,这个28BIT着实让我伤透!!本来想用汇编来解决,但,各位知道它的移植问题,所以放弃.有人能告诉我在C中用"位"(BIT)来进行操作吗?比如一个字符"C",怎么变换成一串可操作的八位的二进制?


左移跟无符号乘2效果上几乎一样
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
黄黄
帖子: 45
注册时间: 2007-04-22 9:09
送出感谢: 0
接收感谢: 0

#4

帖子 黄黄 » 2007-04-24 18:46

不好意思,28位就是指一个28位的数据,但不知道在C里面要怎么定义出来.
头像
猛将兄
帖子: 2052
注册时间: 2005-10-19 17:33
送出感谢: 0
接收感谢: 0

#5

帖子 猛将兄 » 2007-04-24 19:07

你无法定义出一个28位的数据,因为计算机里面,字节是原子单位,你所能得到的只能是24或者32位,如果你只用28位,那么
要么你定义32位,最后一个字节的高四位或者低四位不用
要么,你在磁盘上存的时候做点处理,前一个结构和后一个结构可以共用一个字节,也就是说,两个结构总共是56位,7个字节,取的时候,稍微处理一下就好了,节省点空间 ,多点麻烦

最后,你说的28位不28位,一和C无关,二和汇编无关,除非你的cpu是奇怪的28位cpu,反正我没有听说过
黄黄
帖子: 45
注册时间: 2007-04-22 9:09
送出感谢: 0
接收感谢: 0

#6

帖子 黄黄 » 2007-04-25 20:58

谢谢,是我表达有误,我指的28位是指我要处理的数据是一个28位的.至于你说的共用字节能不能说得详细一点?我不太明白,呵呵
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

#7

帖子 eexpress » 2007-04-25 21:25

unsigned long i:28;
不是每种编译器都支持而已。
● 鸣学
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
送出感谢: 0
接收感谢: 7 次
联系:

#8

帖子 BigSnake.NET » 2007-04-25 22:18

黄黄 写了:谢谢,是我表达有误,我指的28位是指我要处理的数据是一个28位的.至于你说的共用字节能不能说得详细一点?我不太明白,呵呵


那就用32位(long)
最高4位无视
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
diabloneo
帖子: 80
注册时间: 2006-06-06 22:56
送出感谢: 0
接收感谢: 0

#9

帖子 diabloneo » 2007-04-26 17:49

struct {
unsigned i: 28;
} t;

ANSI C 支持
gcc 下可以用

这样 t.i 就是一个28位的二进制数
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
送出感谢: 0
接收感谢: 7 次
联系:

#10

帖子 BigSnake.NET » 2007-04-26 19:40

diabloneo 写了:struct {
unsigned i: 28;
} t;

ANSI C 支持
gcc 下可以用

这样 t.i 就是一个28位的二进制数


你这个是位域语法吧....可不可以不用struct包着,而且作算数运算会不会有限制?
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
黄黄
帖子: 45
注册时间: 2007-04-22 9:09
送出感谢: 0
接收感谢: 0

#11

帖子 黄黄 » 2007-04-27 12:56

谭浩强的C语言书里有一节<<位段>>,里面讲到了这一部分内容.
头像
猛将兄
帖子: 2052
注册时间: 2005-10-19 17:33
送出感谢: 0
接收感谢: 0

#12

帖子 猛将兄 » 2007-04-27 13:21

diabloneo 写了:struct {
unsigned i: 28;
} t;

ANSI C 支持
gcc 下可以用

这样 t.i 就是一个28位的二进制数


实际上和使用32位没有什么区别
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
送出感谢: 0
接收感谢: 7 次
联系:

#13

帖子 BigSnake.NET » 2007-04-27 13:27

猛将兄 写了:
diabloneo 写了:struct {
unsigned i: 28;
} t;

ANSI C 支持
gcc 下可以用

这样 t.i 就是一个28位的二进制数


实际上和使用32位没有什么区别


实际上struct t 还是占32位..
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
zhan
帖子: 1880
注册时间: 2005-08-15 0:04
来自: 南7技校
送出感谢: 0
接收感谢: 0
联系:

#14

帖子 zhan » 2007-04-27 13:31

为了对齐?
飞得高,飞得低,学习再学习,多少大秘密!
http://zhan.blog.ubuntu.org.cn
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
送出感谢: 0
接收感谢: 7 次
联系:

#15

帖子 BigSnake.NET » 2007-04-27 13:35

zhan 写了:为了对齐?

不是...因为一个字节是8个位
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
回复

回到 “C/C++/Java”