欢迎光临
我们一直在努力

9.6华为OD机考真题 新系统 【嵌入式传感器寄存器数据解析】

嵌入式传感器寄存器数据解析

华为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

    bit1bit2:寄存器ID。

    0

    3

    0 \\sim 3

    03

  • bit

    3

    \\text{bit}3

    bit3:数据类型。

    1

    1

    1 表示变长数据类型,

    0

    0

    0 表示固定长度数据类型。

  • bit

    4

    bit

    11

    \\text{bit}4 \\sim \\text{bit}11

    bit4bit11:数据修正因子。

  • bit

    12

    bit

    15

    \\text{bit}12 \\sim \\text{bit}15

    bit12bit15:数据有效长度。

    0

    15

    0 \\sim 15

    015,数据类型为

    1

    1

    1 时才生效。

  • bit

    16

    bit

    30

    \\text{bit}16 \\sim \\text{bit}30

    bit16bit30:数据。数据类型为

    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

  • 寄存器ID为

    0

    0

    0 时:返回有效数据与数据修正因子按位与的结果。

  • 寄存器ID为

    1

    1

    1 时:返回有效数据与数据修正因子按位或的结果。

  • 寄存器ID为

    2

    2

    2 时:返回有效数据与数据修正因子按位异或的结果。

  • 寄存器ID为

    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

      bit1bit2

      00

      00

      00

    • bit

      3

      \\text{bit}3

      bit3

      0

      0

      0

    • bit

      4

      bit

      11

      \\text{bit}4 \\sim \\text{bit}11

      bit4bit11

      1111

       

      0100

      1111\\ 0100

      1111 0100

    • bit

      12

      bit

      15

      \\text{bit}12 \\sim \\text{bit}15

      bit12bit15

      0011

      0011

      0011

    • bit

      16

      bit

      30

      \\text{bit}16 \\sim \\text{bit}30

      bit16bit30

      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)
  • 先检验1,2,3三种非法清空
  • 按照type和len以及data提取出有效数据
  • 然后按照ID值,进行对应的validData 和修正系数运算即可。
  • 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;
    }

    赞(0)
    未经允许不得转载:171主机测评 » 9.6华为OD机考真题 新系统 【嵌入式传感器寄存器数据解析】
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址