自从我在大学的集会课(确切地说是20年)以来已经有一段时间了。
当有人给你一个数字时,比如19444,并说X是15到8位,Y是7到0位...我该如何计算X和Y的值?
我保证这不是家庭作业,只是一个不明智地试图进行固件编程的软件人员。
答案 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