标签: binary-operators

什么是按位移位(位移)运算符以及它们如何工作?

我一直在尝试在业余时间学习C语言,其他语言(C#,Java等)具有相同的概念(通常是相同的运算符)......

我想知道是,在核心层,是什么位移(<<,>>,>>>)这样做,可以帮助它什么问题解决,和周围的弯曲什么潜伏的陷阱?换句话说,一个绝对的初学者指导比特移位的所有优点.

bit-manipulation binary-operators operators bit-shift

1340
推荐指数
9
解决办法
67万
查看次数

为什么C#编译器会将此变换!=比较,就像它是>比较一样?

我有机会发现C#编译器会改变这个方法:

static bool IsNotNull(object obj)
{
    return obj != null;
}
Run Code Online (Sandbox Code Playgroud)

...进入这个CIL:

.method private hidebysig static bool IsNotNull(object obj) cil managed
{
    ldarg.0   // obj
    ldnull
    cgt.un
    ret
}
Run Code Online (Sandbox Code Playgroud)

...或者,如果您更喜欢查看反编译的C#代码:

static bool IsNotNull(object obj)
{
    return obj > null;   // (note: this is not a valid C# expression)
}
Run Code Online (Sandbox Code Playgroud)

怎么把它!=翻译成" >"?

c# il cil binary-operators notnull

147
推荐指数
1
解决办法
5384
查看次数

玩引用

我明白为什么

$a = new ArrayObject();
$a['ID'] = 42;
$b = &$a['ID'];
$c = $a;
$c['ID'] = 37;
echo $a['ID']."\n";
echo $b."\n";
echo $c['ID']."\n";
Run Code Online (Sandbox Code Playgroud)

输出37,42,37

$a = new ArrayObject();
$a['ID'] = 42;
$b = &$a['ID'];
$c = $a;
$b = 37;
echo $a['ID']."\n";
echo $b."\n";
echo $c['ID']."\n";
Run Code Online (Sandbox Code Playgroud)

输出37,37,37

在这两种情况下$b都是对$a['ID']while 的引用$c是指向同一个对象的指针$a.

$b改变$a['ID']$c['ID']变化,因为分配$b改变由参考价值$a['ID'].

$c['ID']变化,新的int被分配到$a['ID'],$b不引用$a['ID']了.

但这让我很沮丧

$a …
Run Code Online (Sandbox Code Playgroud)

php reference binary-operators

19
推荐指数
1
解决办法
388
查看次数

Java 8 - 在List中存储lambdas

我想知道是否可以将lambda存放在某个容器中,例如.ArrayList或HashMap.我想更改该代码:

public enum OPCODE implements BinaryOperator<Integer> {
    MOV((x, y) -> y),
    INC((x, y) -> ++x),
    DEC((x, y) -> --x),
    ADD((x, y) -> x + y),
    SUB((x, y) -> x - y);

    private final BinaryOperator<Integer> binaryOperator;

    OPCODE(BinaryOperator<Integer> binaryOperator) {
        this.binaryOperator = binaryOperator;
    }  

    @Override
    public Integer apply(Integer integer, Integer integer2) {
        return binaryOperator.apply(integer, integer2);
    }
}
Run Code Online (Sandbox Code Playgroud)

对于这样的事情:

List<BinaryOperator<Integer>> opcodes = new ArrayList<BinaryOperator<Integer>>(){
    ((x, y) -> y),
    ((x, y) -> ++x)
};
Run Code Online (Sandbox Code Playgroud)

等等

并像这样使用它:

opcodes[0].apply(a, b);
Run Code Online (Sandbox Code Playgroud)

甚至可能吗?

lambda containers binary-operators lookup-tables java-8

15
推荐指数
2
解决办法
2335
查看次数

了解重载的operator []示例

我对在c ++测试中看到的问题感到困惑.代码在这里:

#include <iostream>
using namespace std;

class Int {
public:
    int v;
    Int(int a) { v = a; }
    Int &operator[](int x) {
        v+=x;
        return *this;
    }
};
ostream &operator<< (ostream &o, Int &a) {
    return o << a.v;
}

int main() {
    Int i = 2;
    cout << i[0] << i[2]; //why does it print 44 ?
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我确信这会打印,24但它会打印出来44.我真的希望有人澄清一下.这是累积评估吗?也是<< 二进制中缀

提前致谢

编辑:如果没有明确定义的运算符重载,有人可以在这里更好地实现重载运算符,以便打印24

c++ overloading operator-overloading binary-operators operators

13
推荐指数
2
解决办法
496
查看次数

为什么这个按位右移似乎不起作用?

有人可以向我解释为什么面具根本没有向右移动吗?您可以使用任何代替1的结果,结果将是相同的.

unsigned mask = ~0 >> 1;
printf("%u\n", mask);
Run Code Online (Sandbox Code Playgroud)

c bit-manipulation binary-operators bit-shift not-operator

10
推荐指数
2
解决办法
2485
查看次数

c ++使用按位或"|"在一个函数参数中的多个枚举

我最近遇到了一些函数,你可以传递这样的多个枚举:

myFunction(One | Two);
Run Code Online (Sandbox Code Playgroud)

因为我认为这是一种非常优雅的方式,所以我尝试自己实现这样的方式:

void myFunction(int _a){
    switch(_a){
        case One:
            cout<<"!!!!"<<endl;
            break;
        case Two:
            cout<<"?????"<<endl;
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试用One |调用该函数 二,我希望两个开关案例都被调用.我对二元运算符不是很好,所以我真的不知道该怎么做.任何想法都会很棒!

谢谢!

c++ enums binary-operators switch-statement

9
推荐指数
2
解决办法
6452
查看次数

Numpy中没有结构化数组的二元运算符?

好的,所以在浏览了numpy结构化数组的教程后,我能够创建一些简单的例子:

from numpy import array, ones
names=['scalar', '1d-array', '2d-array']
formats=['float64', '(3,)float64', '(2,2)float64']
my_dtype = dict(names=names, formats=formats)
struct_array1 = ones(1, dtype=my_dtype)
struct_array2 = array([(42., [0., 1., 2.], [[5., 6.],[4., 3.]])], dtype=my_dtype)
Run Code Online (Sandbox Code Playgroud)

(我的预期用例将有三个以上的条目,并将使用非常长的1d阵列.)因此,一切顺利,直到我们尝试执行一些基本的数学运算.我得到以下所有错误:

struct_array1 + struct_array2
struct_array1 * struct_array2
1.0 + struct_array1
2.0 * struct_array2
Run Code Online (Sandbox Code Playgroud)

显然,即使是最简单的结构化数组也不支持简单的运算符(+, - ,*,/).或者我错过了什么?我是否应该看一些其他的包裹(并且不要说熊猫,因为它完全过度杀戮)?这似乎是一个显而易见的能力,所以我有点傻眼.但是很难在网上找到任何有关此问题的喋喋不休.这不会严重限制结构化数组的有用性吗?为什么有人会使用结构数组而不是数组打包到dict中?是否存在技术上的原因导致这种情况难以解决?或者,如果正确的解决方案是执行重载的艰巨工作,那么如何在保持操作快速的同时完成?

python numpy binary-operators structured-array

8
推荐指数
1
解决办法
530
查看次数

我对monoid的理解是否有效?

所以,我现在正在学习Haskell,我想确认或揭穿我对monoid的理解.

我从阅读CIS194课程中发现的是,monoid基本上是用于在自定义集上定义自定义二进制操作的"API".

比我去告诉自己更多,我偶然发现了大量非常令人困惑的教程,试图澄清这个问题,所以我不再那么肯定了.

我有不错的数学背景,但我对所有的比喻感到困惑,我正在寻找对我对monoid的理解的明确是/否答案.

haskell binary-operators operators monoids

8
推荐指数
2
解决办法
238
查看次数

用BinaryOperator替换开关

我正在尝试通过BinaryOperator功能接口替换用于算术运算的公共开关.

基本方法是:

private static int computeOne(int res, String operand, String operation) {
    int number = Integer.parseInt(operand);

    switch (operation) {
        case "+":
            res += number;
            break;
        case "-":
            res -= number;
            break;
        case "*":
            res *= number;
            break;
        case "/":
            res = (number != 0 ? res / number : Integer.MAX_VALUE);
            break;
        default:
            res = 0;
            System.out.println("unknown operation");
    }

    return res;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,编写类似的内容是必要的:

BinaryOperator<Integer> action = (a,b) -> computeExpression(a + operation + b);
action.apply(res, operand);
Run Code Online (Sandbox Code Playgroud)

但我不明白如何避免switchcomputeExpression …

java binary-operators java-8 functional-interface

8
推荐指数
1
解决办法
146
查看次数