小编ita*_*chi的帖子

Java中"if"条件的奇怪优化

我决定检查Java编译器的明显性; 因此,我写了一个简单的课程.

public class Foo {
    public Foo(boolean a, int b) {
        if (a == true && a != false) {
            b = 1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道编译器是否会将条件优化为更简单的条件:

if (a == true) {}
Run Code Online (Sandbox Code Playgroud)

我编译了该类,然后使用该javap工具对其进行了反汇编.当我看一下输出时,我真是傻眼了,因为编译器检查了这两个条件,下面清楚地显示了什么.

Compiled from "Foo.java"
public class Foo {
  public Foo(boolean, int);
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: iload_1
       5: iconst_1
       6: if_icmpne     15
       9: iload_1
      10: ifeq          15
      13: iconst_1
      14: istore_2
      15: return
}
Run Code Online (Sandbox Code Playgroud)

我只是好奇,为什么它可以执行冗余指令,什么时候可以优化到更简单的东西?

java compiler-optimization

9
推荐指数
1
解决办法
168
查看次数

将二进制补码、左对齐整数转换为常规二进制

我正在用 C++ 和 Qt 对 Raspberry Pi 3 进行编程。我正在使用WiringPi库与 I2C 加速度计连接(我用它来比较倾斜角度值,但不测量角度)。

我需要确定一个加速度计读数是否大于或小于前一个读数或具有任意预设值。(我的机器上有一个手臂,我想将其设置为任意角度,然后让手臂移动到该角度或从该角度移动。)

加速度计以两个字节的二进制补码数据输出读数。数据为十二位左对齐。(我假设这意味着加速度计值的 4 个最高有效位位于高字节的左侧?)加速度计是 LIS3DH。

我正在将两个字节作为 2 个整数值读入程序中,但我正在努力将数据转换为有用的信息。

WiringPi I2C 库仅返回整数。

我可能需要将十进制读数转换为二进制,将两个字节的二进制补码左对齐二进制数据转换为十二位右对齐常规二进制数据。

我正在寻找有关如何完成此任务的建议,以及是否有比上面列出的路径更简单的方法来完成此任务。

编辑:

void main(void)       
{
    int acc_l = 0, acc_h = 0;
    acc_l = read_output_register_lo;
    acc_h = read_output_register_hi;

/*
How do I convert acc_l and acc_h to binary?

Do I need to shift acc_h 4 bits to the right?

How do I concatenate acc_h and acc_l into a 12 bit binary number?

How do I …
Run Code Online (Sandbox Code Playgroud)

binary type-conversion raspberry-pi3

4
推荐指数
1
解决办法
5501
查看次数

AngularJS自定义提供程序导致“未知提供程序”异常

我在AngularJS中创建了一个自定义提供程序,该应用程序应该是应用程序的全局配置。不幸的是,我无法注入该提供程序,因为AngularJS抛出“未知提供程序”异常。我完全不知道我的代码有什么问题。

app.js

(function () {
    'use strict';

    angular.module('app', [
        'config'
    ])
    .config(configuration);

    configuration.$inject = ['ConfigProvider'];

    function configuration(ConfigProvider) {
        ConfigProvider.setFoo(86400);
    }
})();
Run Code Online (Sandbox Code Playgroud)

config-provider.js

(function () {
    'use strict';

    angular.module('config')
        .provider('ConfigProvider', ConfigProvider);

    ConfigProvider.$inject = [];

    function ConfigProvider() {
        var config = [];

        var provider = {
            $get: $get,
            setFoo: setFoo,
        };

        return provider;

        function $get() {
            return {
                getConfig: function () {
                    return config;
                }
            };
        }

        function setFoo(foo) {
            config['foo'] = foo;
        }
    }
})();
Run Code Online (Sandbox Code Playgroud)

首先将config-provider.js加载到我的脚本文件中,但是更改顺序始终不会更改行为-仍然是“未知提供程序”。任何帮助将不胜感激。

javascript angularjs

2
推荐指数
1
解决办法
536
查看次数