Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 何时需要使用位移位/一元运算符等?_C# - Fatal编程技术网

C# 何时需要使用位移位/一元运算符等?

C# 何时需要使用位移位/一元运算符等?,c#,C#,可能的重复项: 虽然我很久以前就应该知道这一点,但什么编码任务/场景对位移位/一元运算符等有用 在我所做的编码(主要是LOB应用程序)中,我从来没有看到对这些概念的需求,那么什么样的任务/问题会让我得出需要使用这些概念的结论呢 谢谢这样不行,你不只是“需要”使用它们。更重要的是,如果使用位移位操作,您需要使给定的任务更快 通常,您“需要”它们的东西很少,但它们对于许多数学函数的性能以及改进哈希函数和其他加密操作(实际上是基于数学的…)非常有用。基本上,在大多数情况下,都是为了提高给定算法的性

可能的重复项:

虽然我很久以前就应该知道这一点,但什么编码任务/场景对位移位/一元运算符等有用

在我所做的编码(主要是LOB应用程序)中,我从来没有看到对这些概念的需求,那么什么样的任务/问题会让我得出需要使用这些概念的结论呢


谢谢

这样不行,你不只是“需要”使用它们。更重要的是,如果使用位移位操作,您需要使给定的任务更快


通常,您“需要”它们的东西很少,但它们对于许多数学函数的性能以及改进哈希函数和其他加密操作(实际上是基于数学的…)非常有用。基本上,在大多数情况下,都是为了提高给定算法的性能。

这样做行不通,您不只是“需要”使用它们。更重要的是,如果使用位移位操作,您需要使给定的任务更快


通常,您“需要”它们的东西很少,但它们对于许多数学函数的性能以及改进哈希函数和其他加密操作(实际上是基于数学的…)非常有用。基本上,在大多数情况下,都是为了提高给定算法的性能。

当你生活在C#时,日常工作中没有太多的用处。主要是在与具有子字节粒度(结构封送等)的非托管代码进行互操作时,处理字节顺序转换(小端/大端)。在幕后,使用FlagsAttribute的Enum已经完成了这项工作


许多非托管内容使用位字段实现非常高效的存储。比特域在C#中可能是一个巨大的痛苦。我已经完成了一些托管用户模式驱动程序框架编码,以及一些使用C#的原始TIFF文件格式的工作,结果糟透了。C/C++有更好的处理这些问题的工具。

当你住在C#时,日常生活中的东西没有太多用处。主要是在与具有子字节粒度(结构封送等)的非托管代码进行互操作时,处理字节顺序转换(小端/大端)。在幕后,使用FlagsAttribute的Enum已经完成了这项工作


许多非托管内容使用位字段实现非常高效的存储。比特域在C#中可能是一个巨大的痛苦。我已经完成了一些托管用户模式驱动程序框架编码,以及一些使用C#的原始TIFF文件格式的工作,结果糟透了。C/C++有更好的处理工具。

任何涉及某种位级编码的东西,例如UTF-8和其他多字节字符编码。在这些情况下,您需要检查单个位并将位字符串组合在一起

另外,最简单的情况是,您希望在单个字节中存储各种标志。您可以定义如下内容:

const uint FOO_DELETED = 0x01;
const uint FOO_DRAFT = 0x02;
const uint FOO_WHATEVER = 0x04;
// ...
然后,您可以在单个字节中组合这些内容:

byte my_flags = FOO_DELETED | FOO_WHATEVER;
并提取它们:

bool is_deleted = (my_flags & FOO_DELETED);

任何涉及某种位级编码的内容,例如UTF-8和其他多字节字符编码。在这些情况下,您需要检查单个位并将位字符串组合在一起

另外,最简单的情况是,您希望在单个字节中存储各种标志。您可以定义如下内容:

const uint FOO_DELETED = 0x01;
const uint FOO_DRAFT = 0x02;
const uint FOO_WHATEVER = 0x04;
// ...
然后,您可以在单个字节中组合这些内容:

byte my_flags = FOO_DELETED | FOO_WHATEVER;
并提取它们:

bool is_deleted = (my_flags & FOO_DELETED);

另一个例子是乘或除2

int a = 10;
int result = 0;

result = a << 1; // result is 10 * 2 == 20;
result = a >> 1; // result is 10 / 2 == 5;
inta=10;
int结果=0;
结果=a>1;//结果为10/2==5;

这些运算通常比“实”运算符*或/

快得多。另一个例子是乘或除2

int a = 10;
int result = 0;

result = a << 1; // result is 10 * 2 == 20;
result = a >> 1; // result is 10 / 2 == 5;
inta=10;
int结果=0;
结果=a>1;//结果为10/2==5;

这些操作通常比“real”操作符*或/

Duplicate:Duplicate:Duplicate:Duplicate:Duplicate:“通常快得多”-您尝试过吗?这里没有区别:
迭代次数:100000000次,通常是因为作为Botz3000的编译器可以优化此类操作。但是,是的,我在嵌入式系统编程中使用过很多次。“通常更快”-您尝试过吗?这里没有区别:
Iterations:100000000 x通常是因为编译器Botz3000可以优化此类操作。但是,是的,我已经在嵌入式系统编程中使用过很多次了。