嵌入式传感器寄存器数据解析
华为OD机试真题 新系统 华为OD上机考试真题新系统 9月6号 200分题型
华为OD机试真题新系统目录点击查看: 华为OD机试真题新系统题库目录|机考题库 + 算法考点详解
题目内容
系统从传感器的某个寄存器读取一个
32
32
32 位的 int 型整数 packet。请按如下要求解析输入数据,然后按十进制格式输出结果。 该数据的二进制结构定义如下:
-
bit
0
\\text{bit}0
bit0(最低位):状态。1
1
1 表示传感器正常,0
0
0 表示传感器故障。 -
bit
1
∼
bit
2
\\text{bit}1 \\sim \\text{bit}2
bit1∼bit2:寄存器ID。0
∼
3
0 \\sim 3
0∼3。 -
bit
3
\\text{bit}3
bit3:数据类型。1
1
1 表示变长数据类型,0
0
0 表示固定长度数据类型。 -
bit
4
∼
bit
11
\\text{bit}4 \\sim \\text{bit}11
bit4∼bit11:数据修正因子。 -
bit
12
∼
bit
15
\\text{bit}12 \\sim \\text{bit}15
bit12∼bit15:数据有效长度。0
∼
15
0 \\sim 15
0∼15,数据类型为1
1
1 时才生效。 -
bit
16
∼
bit
30
\\text{bit}16 \\sim \\text{bit}30
bit16∼bit30:数据。数据类型为1
1
1 时,从低到高依据数据有效长度确定实际有效数据位;数据类型为0
0
0 时,全部为有效数据位。 -
bit
31
\\text{bit}31
bit31:数据奇偶校验位:数据中的所有有效数据位与奇偶校验位中1
1
1 的个数为偶数,表示数据校验通过;否则为不通过。
解析流程:
0
0
0),返回
−
1
-1
−1。
−
2
-2
−2。
1
1
1 时,数据有效长度如果为
0
0
0,则返回
−
3
-3
−3。
0
0
0 时:返回有效数据与数据修正因子按位与的结果。
1
1
1 时:返回有效数据与数据修正因子按位或的结果。
2
2
2 时:返回有效数据与数据修正因子按位异或的结果。
3
3
3 时:返回有效数据与数据修正因子按位同或的结果。
注:解析流程中
4
4
4、
5
5
5、
6
6
6、
7
7
7 步骤的结果返回前需要和
0x0FFFFFFFF
\\text{0x0FFFFFFFF}
0x0FFFFFFFF 取与。
输入描述
输入为一个
32
32
32 位整型数值 packet。
输出描述
按十进制格式输出解析结果。
样例1
输入
343873
输出
4
说明 正常解析(寄存器ID=
0
0
0,& 运算)。 输入:
packet
=
0x00053F41
\\text{packet} = \\text{0x00053F41}
packet=0x00053F41(十进制
343873
343873
343873)。 二进制:
0000
0000
0000
0101
0011
1111
0100
0001
0000\\ 0000\\ 0000\\ 0101\\ 0011\\ 1111\\ 0100\\ 0001
0000 0000 0000 0101 0011 1111 0100 0001。 分析:
-
bit
0
\\text{bit}0
bit0:1
1
1 -
bit
1
∼
bit
2
\\text{bit}1 \\sim \\text{bit}2
bit1∼bit2:00
00
00 -
bit
3
\\text{bit}3
bit3:0
0
0 -
bit
4
∼
bit
11
\\text{bit}4 \\sim \\text{bit}11
bit4∼bit11:1111
0100
1111\\ 0100
1111 0100 -
bit
12
∼
bit
15
\\text{bit}12 \\sim \\text{bit}15
bit12∼bit15:0011
0011
0011 -
bit
16
∼
bit
30
\\text{bit}16 \\sim \\text{bit}30
bit16∼bit30:000
0000
0000
0101
000\\ 0000\\ 0000\\ 0101
000 0000 0000 0101 -
bit
31
\\text{bit}31
bit31:0
0
0 解析流程: - 状态检查:状态为
1
1
1,正常。 - 数据提取:数据类型为
0
0
0,实际数据为0x0005
\\text{0x0005}
0x0005。 - 奇偶校验:数据
0x0005
\\text{0x0005}
0x0005(二进制101
101
101)有2
2
2 个1
1
1。校验位为0
0
0。总数2
+
0
=
2
2+0=2
2+0=2(偶数),校验通过。 - 运算:寄存器ID为
0
0
0,执行与:0x05
\\text{0x05}
0x05 &0xF4
\\text{0xF4}
0xF4。 -
0000
0101
0000\\ 0101
0000 0101(5
5
5) -
1111
0100
1111\\ 0100
1111 0100(244
244
244) - 结果:
0000
0100
0000\\ 0100
0000 0100 &0x0FFFFFFFF
=
4
\\text{0x0FFFFFFFF} = 4
0x0FFFFFFFF=4(十进制) 输出:4
4
4。
样例2
输入
0
输出
-1
说明 输入:
packet
=
0x00000000
\\text{packet} = \\text{0x00000000}
packet=0x00000000(十进制
0
0
0)。 二进制:
0000
0000
0000
0000
0000
0000
0000
0000
0000\\ 0000\\ 0000\\ 0000\\ 0000\\ 0000\\ 0000\\ 0000
0000 0000 0000 0000 0000 0000 0000 0000。 分析:
-
bit
0
\\text{bit}0
bit0:0
0
0(表示异常) 返回:−
1
-1
−1。
题解
思路:位运算
- 状态(bit0)
- 寄存器ID(bit1-bit2)
- 数据类型(bit3)
- 修正系数(bit4-bit11)
- 有效长度(bit12-bit15)
- 数据(bit16-bit30)
- 奇偶校验位(bit31)
C++
#include<bits/stdc++.h>
using namespace std;
int solve(int packet) {
int state = packet & 1;
if (state == 0) {
return –1;
}
int id = (packet >> 1) & 3;
int type = (packet >> 3) & 1;
int factor = (packet >> 4) & 0xFF;
int len = (packet >> 12) & 0xF;
// 提取全部数据
int data = (packet >> 16) & 0x7FFF;
// 确定有效位
int mask;
if (type == 1) {
if (len == 0) {
return –3;
}
mask = (1 << len) – 1;
} else {
mask = 0x7FFF;
}
// 只保留有效数据
data &= mask;
// 奇偶校验
int ones = 0;
for (int i = 0; i < 15; i++) {
if ((data >> i) & 1) {
ones++;
}
}
// bit31:奇偶校验位
if ((packet >> 31) & 1) {
ones++;
}
if (ones % 2 != 0) {
return –2;
}
int result;
if (id == 0) {
result = data & factor;
} else if (id == 1) {
result = data | factor;
} else if (id == 2) {
result = data ^ factor;
} else {
// 按位同或
result = ~(data ^ factor);
}
return result;
}
int main() {
int packet;
cin >> packet;
cout << solve(packet);
return 0;
}
JAVA
import java.util.*;
public class Main {
static int solve(int packet) {
int state = packet & 1;
if (state == 0) {
return –1;
}
int id = (packet >> 1) & 3;
int type = (packet >> 3) & 1;
int factor = (packet >> 4) & 0xFF;
int len = (packet >> 12) & 0xF;
// 提取全部数据
int data = (packet >> 16) & 0x7FFF;
// 确定有效位
int mask;
if (type == 1) {
if (len == 0) {
return –3;
}
mask = (1 << len) – 1;
} else {
mask = 0x7FFF;
}
// 只保留有效数据
data &= mask;
// 奇偶校验
int ones = 0;
for (int i = 0; i < 15; i++) {
if (((data >> i) & 1) != 0) {
ones++;
}
}
// bit31:奇偶校验位
if (((packet >> 31) & 1) != 0) {
ones++;
}
if (ones % 2 != 0) {
return –2;
}
int result;
if (id == 0) {
result = data & factor;
} else if (id == 1) {
result = data | factor;
} else if (id == 2) {
result = data ^ factor;
} else {
// 按位同或
result = ~(data ^ factor);
}
return result;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int packet = sc.nextInt();
System.out.println(solve(packet));
}
}
Python
def solve(packet):
state = packet & 1
if state == 0:
return –1
id = (packet >> 1) & 3
type = (packet >> 3) & 1
factor = (packet >> 4) & 0xFF
length = (packet >> 12) & 0xF
# 提取全部数据
data = (packet >> 16) & 0x7FFF
# 确定有效位
if type == 1:
if length == 0:
return –3
mask = (1 << length) – 1
else:
mask = 0x7FFF
# 只保留有效数据
data &= mask
# 奇偶校验
ones = 0
for i in range(15):
if (data >> i) & 1:
ones += 1
# bit31:奇偶校验位
if (packet >> 31) & 1:
ones += 1
if ones % 2 != 0:
return –2
if id == 0:
result = data & factor
elif id == 1:
result = data | factor
elif id == 2:
result = data ^ factor
else:
# 按位同或
result = ~(data ^ factor)
return result
packet = int(input())
print(solve(packet))
JavaScript
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', (line) => {
const packet = Number(line.trim());
console.log(solve(packet));
rl.close();
});
function solve(packet) {
let state = packet & 1;
if (state === 0) {
return –1;
}
let id = (packet >> 1) & 3;
let type = (packet >> 3) & 1;
let factor = (packet >> 4) & 0xFF;
let len = (packet >> 12) & 0xF;
// 提取全部数据
let data = (packet >> 16) & 0x7FFF;
// 确定有效位
let mask;
if (type === 1) {
if (len === 0) {
return –3;
}
mask = (1 << len) – 1;
} else {
mask = 0x7FFF;
}
// 只保留有效数据
data &= mask;
// 奇偶校验
let ones = 0;
for (let i = 0; i < 15; i++) {
if ((data >> i) & 1) {
ones++;
}
}
// bit31:奇偶校验位
if ((packet >>> 31) & 1) {
ones++;
}
if (ones % 2 !== 0) {
return –2;
}
let result;
if (id === 0) {
result = data & factor;
} else if (id === 1) {
result = data | factor;
} else if (id === 2) {
result = data ^ factor;
} else {
// 按位同或
result = ~(data ^ factor);
}
return result;
}
Go
package main
import (
"bufio"
"fmt"
"os"
)
func solve(packet int32) int32 {
state := packet & 1
if state == 0 {
return –1
}
id := (packet >> 1) & 3
typ := (packet >> 3) & 1
factor := (packet >> 4) & 0xFF
length := (packet >> 12) & 0xF
// 提取全部数据
data := (packet >> 16) & 0x7FFF
// 确定有效位
var mask int32
if typ == 1 {
if length == 0 {
return –3
}
mask = (1 << length) – 1
} else {
mask = 0x7FFF
}
// 只保留有效数据
data &= mask
// 奇偶校验
ones := 0
for i := 0; i < 15; i++ {
if (data>>i)&1 != 0 {
ones++
}
}
// bit31:奇偶校验位
if uint32(packet)>>31&1 != 0 {
ones++
}
if ones%2 != 0 {
return –2
}
var result int32
if id == 0 {
result = data & factor
} else if id == 1 {
result = data | factor
} else if id == 2 {
result = data ^ factor
} else {
// 按位同或
result = ^(data ^ factor)
}
return result
}
func main() {
in := bufio.NewReader(os.Stdin)
var packet int32
fmt.Fscan(in, &packet)
fmt.Println(solve(packet))
}
C语言
#include <stdio.h>
int solve(int packet) {
int state = packet & 1;
if (state == 0) {
return –1;
}
int id = (packet >> 1) & 3;
int type = (packet >> 3) & 1;
int factor = (packet >> 4) & 0xFF;
int len = (packet >> 12) & 0xF;
// 提取全部数据
int data = (packet >> 16) & 0x7FFF;
// 确定有效位
int mask;
if (type == 1) {
if (len == 0) {
return –3;
}
mask = (1 << len) – 1;
} else {
mask = 0x7FFF;
}
// 只保留有效数据
data &= mask;
// 奇偶校验
int ones = 0;
for (int i = 0; i < 15; i++) {
if ((data >> i) & 1) {
ones++;
}
}
// bit31:奇偶校验位
if ((unsigned int)packet >> 31 & 1) {
ones++;
}
if (ones % 2 != 0) {
return –2;
}
int result;
if (id == 0) {
result = data & factor;
} else if (id == 1) {
result = data | factor;
} else if (id == 2) {
result = data ^ factor;
} else {
// 按位同或
result = ~(data ^ factor);
}
return result;
}
int main() {
int packet;
scanf("%d", &packet);
printf("%d", solve(packet));
return 0;
}


