我一直在尝试在业余时间学习C语言,其他语言(C#,Java等)具有相同的概念(通常是相同的运算符)......
我想知道是,在核心层,是什么位移(<<,>>,>>>)这样做,可以帮助它什么问题解决,和周围的弯曲什么潜伏的陷阱?换句话说,一个绝对的初学者指导比特移位的所有优点.
我有机会发现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)
怎么把它!=翻译成" >"?
我明白为什么
$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) 我想知道是否可以将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)
甚至可能吗?
我对在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
有人可以向我解释为什么面具根本没有向右移动吗?您可以使用任何代替1的结果,结果将是相同的.
unsigned mask = ~0 >> 1;
printf("%u\n", mask);
Run Code Online (Sandbox Code Playgroud) 我最近遇到了一些函数,你可以传递这样的多个枚举:
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 |调用该函数 二,我希望两个开关案例都被调用.我对二元运算符不是很好,所以我真的不知道该怎么做.任何想法都会很棒!
谢谢!
好的,所以在浏览了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中?是否存在技术上的原因导致这种情况难以解决?或者,如果正确的解决方案是执行重载的艰巨工作,那么如何在保持操作快速的同时完成?
所以,我现在正在学习Haskell,我想确认或揭穿我对monoid的理解.
我从阅读CIS194课程中发现的是,monoid基本上是用于在自定义集上定义自定义二进制操作的"API".
比我去告诉自己更多,我偶然发现了大量非常令人困惑的教程,试图澄清这个问题,所以我不再那么肯定了.
我有不错的数学背景,但我对所有的比喻感到困惑,我正在寻找对我对monoid的理解的明确是/否答案.
我正在尝试通过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)
但我不明白如何避免switch与computeExpression …