这是运算符<</>>的正确实现吗?
Is this a correct implementation of operator<< / >>?
这些是运算符<lt;和>>用于比特移位?出于某种原因,在我的运算符/中,它只涉及这两个运算符,它允许一个愚蠢的跳跃,导致除法做得不正确。
// the value is stored msb in a list of uint8_t
// so 0x123456 will be stored in the list as {0x12, 0x34, 0x56}
integer operator<<(size_t shift){
std::list <uint8_t> out = value;
for(unsigned int i = 0; i < (shift >> 3); i++)
out.push_back(0);
shift &= 7;
if (shift){
out.push_front(0);
std::list <uint8_t>::iterator i = out.begin(), j = out.end();
i++; j--;
for(; i != j; i++){
uint8_t temp = *i >> (8 - shift);
--i;
*i += temp;
i++;
*i = (uint8_t) (*i << shift);
}
uint8_t temp = *i >> (8 - shift);
i--;
*i += temp;
i++;
*i <<= shift;
}
return integer(out);
}
integer operator>>(size_t shift){
std::list <uint8_t> out = value;
for(unsigned int i = 0; i < (shift >> 3); i++)
out.pop_back();
shift &= 7;
if (shift){
std::list <uint8_t>::reverse_iterator i = out.rbegin(), j = out.rend();
j--;
for(; i != j; i++){
*i >>= shift;
i++;
uint8_t temp = *i << (8 - shift);
i--;
*i += temp;
}
*j >>= shift;
}
return integer(out);
}
我在做什么:
integer(1234567) / integer(6)
inside division algorithm (long division):
numerator largest multiple of denomiator < numeator
12d687 0c0000
06d687 060000
d687 c000
1687 0c00
0a87 0600
0487 0300
0187 0c <-- where did this come from??
017b 0180
错误是显示在其中一个运算符中还是其他运算符中?
这是我的全部代码:http://ideone.com/ncq9S
template <typename T>
这真的需要参数化吗?似乎任何偏移量都可以存储在size_t
中,在开始其余过程之前,隐式或显式转换为size_t
是个好主意。
integer operator<<(T shift){
通常,二进制operator
函数最好作为非成员friend
s来实现。例如,与通用操作数相比,在生成this
指针时考虑的转换更少。我会写friend integer operator<< ( integer lhs, size_t shift )
。
std::list <uint8_t> out = value;
如果使用friend
并传递值,则会隐式生成此副本。如果您真的只是修改一个对象,例如q = q << 3
,编译器也可以更容易地消除它。
for(unsigned int i = 0; i < (shift >> 3); i++)// get rid of bytes if shift > 8
在循环条件下要小心。您正在将运算符应用于高级类型,这可能会导致昂贵的计算(如果T
是integer
,甚至会导致无休止的递归!
shift &= 7; // shift by less than a byte
在这一点上,如果shift == 0
,您就完成了。最好在此处插入条件return
。此外,现在范围确实受到限制,因此分配给比T
更窄的类型。
out.push_front(0); // extra byte for overflow
只有当字节为非零时,这才是必要的。可能最好将第一个操作设为特殊情况,并使push_front
成为条件,而不是将特殊情况设为最后一个。
…嗯,看起来operator>>
被锻炼得更多了…跳到那个…
for(; i != j; i++){
i++;
uint8_t temp = *i << (8 - shift);
i--;
*i += temp;
}
*j >>= shift;
显然,循环中缺少>>
运算符。尝试*i = *i >> shift + temp
。此外,我看不出这个列表是怎么变短的。这是在integer::integer( list<…> )
中完成的吗?
然而,我真的看不出是什么在发布的输出中产生了这种行为。前导零可能是operator<<
中无条件push_front
的结果,但我期望的模式是c
、6
、3
、18
、c
…。你似乎没有重复任何序列,而是随机跳跃。
也许除法代码或类构造函数可以提供线索。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中