草庐IT

左移右移

全部标签

c++ - 当 b 大于 a 中的位数时右移 (a >> b) 的未定义行为?

显然,右移操作的行为:a>>b当b>=sizeof(a)*CHAR_BIT时,在C和C++中未定义(而在正常情况下,由于右移而从左侧引入的“新位”等于零)。当b>=sizeof(a)*CHAR_BIT时,为什么这种未定义的行为比将结果设置为零更好? 最佳答案 我们可以了解为什么语言会从WhyLanguageDesignersTolerateUndefinedBehavior中选择未定义的行为它说:ThisanswercamefromtwogeneraldesignprinciplesbehindC:Thelanguageshould

c++ - 将右移运算符用作模板参数时出现语法错误

如果我采用右移运算符的地址并将其作为模板参数传递,则右移符号会被误读为模板参数列表的末尾,由此产生的混淆会导致多个错误。templatestructTemplateMagic{};structTestStruct{voidoperator>>(int){}};intmain(){//Alltheerrorsareonthisline:TemplateMagic>>*ptr;}在MicrosoftVisualStudioExpress2013forWindowsDesktop中运行版本12.0.31101.00更新4出现以下错误:errorC2143:syntaxerror:missin

java - 算术右移存在哪些实际用例?

我偶然发现了一个问题,询问是否youeverhadtousebitshiftinginrealprojects.我在许多项目中广泛使用位移位,但是,我从来不必使用算术位移位,即左操作数可能为负且符号为负数的位移位应移入位而不是零。例如,在Java中,您可以使用>>进行算术位移。运算符(而>>>将执行逻辑移位)。想了很多,我得出的结论是我从来没有用过>>。左操作数可能为负。如thisanswer中所述算术移位甚至是在C++中定义的实现,因此——与Java相比——C++中甚至没有用于执行算术移位的标准化运算符。答案还指出了一个我什至不知道的转移负数的有趣问题:+63>>1=+31(inte

c++ - 重载左移运算符

我研究发现,当你想为cout重载输出流运算符时,正确的做法是这样做:std::ostream&operator这个函数必须在类之外定义,因为这里发生的是operator特定类的重载应该如下所示:std::ostream&operator编译器/库如何为第二个参数采用泛型定义,特别是因为在C++中没有泛型类(例如Java中的Object)这样的东西? 最佳答案 我觉得你在这里很困惑:theoperator一个是真的operator在classstd::ostream中定义.其实里面定义了好几个版本。但这些与我们无关。此外,它们不是fr

c++ - 测试是否存在左移运算符

我正在尝试找到一个工作类型特征来检测给定类型是否具有std::ostream的左移运算符重载(例如,可与std::cout或boost::lexical_cast互操作)。我在boost::has_left_shift上取得了成功除了类型是POD或std::string的STL容器的情况类型。我怀疑这与STL类型或operatorstd::ostream的有效左移运算符一般识别类型的正确方法是什么??如果那不可行,是否有单独的方法来检测POD或std::string类型的STL容器上左移运算符的过载?下面的代码显示了我目前正在使用的内容,并演示了如何boost::has_left_sh

c++ - 为什么带变量的左移与带常量的左移产生不同的结果?

编译下面的代码后,我得到了一个奇怪的结果,a=1而b=0。谁能解释一下幕后发生的事情?#includeusingnamespacestd;intmain(){intn=32;inta=1 最佳答案 该标准没有定义,或者更确切地说,它将其定义为“未定义的行为”,即在左移超出整数类型的大小的情况下会发生什么。[这种未定义行为的原因是不同的硬件可能会或可能不会表现相同,例如,向左移动32位]。在第一种情况下[至少没有优化],编译器生成指令来计算1-在x86上变成1与1相同-因此你得到1。在第二种情况下,编译器会自己计算值,这会变成溢出,并

c++ - 为什么我必须在*左移之前将 `uint8_t` 转换为 `uint64_t`?

我只想将我的uint8_t数组连接到uint64_t。事实上,我解决了我的问题,但需要了解原因。这是我的代码;uint8_tbyte_array[5];byte_array[0]=0x41;byte_array[1]=0x42;byte_array[2]=0x43;byte_array[3]=0x44;byte_array[4]=0x45;cout第一个输出将是“44434245”,第二个将是“4544434241”,这就是我想要的。因此,正如我们所见,当我将每个字节强制转换为uint64_t代码时有效,但是,如果我不使用强制转换,它会给我无关紧要的结果。谁能解释一下原因?

c++ - 向右移动4个整数不同的值SIMD

SSE没有提供将打包整数移位可变数量的方法(我可以使用任何AVX及更早版本的指令)。您只能进行统一轮类。我试图为vector中的每个整数实现的结果是这样的。i[0]=i[0]&0b111111;i[1]=(i[1]>>6)&0b111111;i[2]=(i[2]>>12)&0b111111;i[3]=(i[3]>>18)&0b111111;本质上是尝试在每个整数中隔离6位不同的组。那么最佳的解决方案是什么?我想到的事情:您可以模拟可变的右移,可变的左移和统一的右移。我考虑过将打包整数分别乘以不同的量(因此模拟左移)。然后,使用该结果,您可以执行统一的右移操作以获得答案。我将用于乘法的特

c++ - 右移非整数类型的数字

我有以下代码#includeusingnamespacestd;intmain(){floatf=56.34f;doubled=12.34101;cout>1.0)>1.0)但它不起作用,并且出现此错误:Infunction'intmain()':Line7:error:invalidoperandsoftypes'float'and'double'tobinary'operator>>'compilationterminateddueto-Wfatal-errors.这里允许在C/C++编译器中右移吗?我正在使用visualstudio2010。 最佳答案

c++ - 在模板中表达左移或右移的优雅方式

我目前有一个模板函数,它可以根据其模板参数A和B向左或向右移动一个值:templatevoidf(X){//...if(A>=B){SetValue(X>(B-A));}当我为A实例化模板时,我在(无法到达的)第一个分支上收到负偏移警告,否则我在第一个分支上收到负偏移警告。我们的代码库没有警告,因此这是NotAcceptable。这两个shift语句是否有简洁、可读的替代方案?类似的问题(例如DynamicallyshiftleftORright)没有这个虚假警告,因为移位距离是那里的运行时变量。 最佳答案 使用C++11或boos