我的位逻辑太过时了。需要复习

时间:2010-07-15 05:13:02

标签: math hardware bit-manipulation

自从我在大学的集会课(确切地说是20年)以来已经有一段时间了。

当有人给你一个数字时,比如19444,并说X是15到8位,Y是7到0位...我该如何计算X和Y的值?

我保证这不是家庭作业,只是一个不明智地试图进行固件编程的软件人员。

5 个答案:

答案 0 :(得分:7)

首先将输入数字转换为十六进制:

19444 => 0x4BF4

十六进制很方便,因为每4个二进制位是一个十六进制数字。因此,每2个十六进制数字是8位或一个字节。现在假设传统的小端符号(查找它!),第7位downto 0是低字节,第15位downto 8是高字节:

   [7:0] => 0xF4
   [15:8] => 0x4B

答案 1 :(得分:3)

使用首选语言,您可以使用按位AND获取最低有效字节:

Y = 19444 & 0xff

或者,更多数学:

Y = 19444 % 256

现在,对于最重要的字节,您可以使用位移(如果数字大于两个字节,则再次应用第一个阶段):

X = 19444 >> 8

答案 2 :(得分:3)

(以下假设C表示法)。通常,要访问位N到M的值,其中N是较小的值,而位从0开始编号,请使用:

(value >> N) & (1U << (M - N + 1)) - 1;

因此对于位0..7,请使用:

(value >> 0) & (1U << 8) - 1

并且对于位8..15,使用:

(value >> 8) & (1U << 8) - 1

请注意,对于“N到M”是该类型的整个宽度的情况,您不能使用所写的移位。

答案 3 :(得分:1)

另外,请注意字节顺序(最重要的字节是否先出现)。

答案 4 :(得分:1)

当给定位位置(如“15到8”)时,按照惯例,位0是二进制数的最低有效位。如果你正在处理一个16位数字,那么第15位是最重要的位。

一个十六进制数字对应4个二进制数字。所以十六进制FF为二进制11111111。按位AND通常用于“屏蔽”某个位集合。

几乎所有处理器都提供某种形式的按位移位。例如,将1010001右移4位可以得到101

结合所有这些,在C中你通常会做这样的事情:

unsigned short int num;
unsigned char x, y;

num = 19444;

y = num & 0xff; //use bitwise AND to get 8 least-sig bits
x = num >> 8;   //right-shift by 8 bits to get 8 most-sig bits