- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究一种应该返回字段值的方法。健全性检查示例:如果字段为三位宽且无符号,则结果将是 0 到 7 之间的值,无论值中位的实际位置如何。如果该值有符号,则结果将在 -4 和 3 之间。此外,如果该值有符号,则仅当该字段的最左边位为 1 时,该值才会为负。在这种情况下,该字段必须进行符号扩展(即将左侧所有位设为 1)。我所拥有的逻辑对我来说似乎是正确的,但似乎是错误的。
在我的测试中,当它为 0:somepoint; 时我就得到了正确的结果。当它在某个点时我会失败:某个点
int getField (int value, int hi, int lo, int isSigned) {
int x = 0;
//int result = 0;
for(int i =lo; i < hi; i++){
x |= (1 << i);
}
if(isSigned == 1){
value |= ~x;
}
else{
value &= x;
}
int finalresult = value >> lo;
return finalresult;
}
最佳答案
而不是
int x = 0;
for(int i =lo; i < hi; i++){
x |= (1 << i);
}
你可以这样做
int x = ((1 << (hi-lo)) - 1) - ((1 << lo) -1);
或从(hi-lo)中添加/减去额外的 1 - 这取决于 hi 位是否为“in”。
为什么?
1 => 0000 0001
1 << 5 => 0010 0000
(1 << 5) - 1 => 0001 1111
此外,负数位于 U2 中符号,所以如果你想对数字取负,你需要执行 2 个步骤:
因此value |= ~x
还不够(您将反转零,但不会反转其余部分,并且仍然需要添加 1)。您可以简单地用 value ^= (-1)
反转。这就是为什么 somepoint:somepoint 案例不起作用。
我写过类似的东西:
#include <cassert>
int getField(int value, int hi, int lo, int isSigned) {
int result = 0;
assert(hi >= lo);
// let say we are interested in folowing bits:
// (marked as 1)
// value := 0001 1100
// so:
// hi := 5
// lo := 2
// and e.g.:
// isSigned := 1
isSigned = (value >> (hi-1)) & isSigned; // isSigned will be 1 if (it was
// 1 and proper bit is set to 1)
// ((0001 1100) >> 4) & 1
// 0000 0001 & 1
// 0000 0001
// isSigned := 1
value >>= lo; // move interested bits that they start at 0
// ((0001 1100) >> 2
// 0000 0111
// value := 0000 0111
hi -= lo; // how many bits we want?
// hi := 3
isSigned &= (hi != 0); // hi == 0 <=> hi == lo
// => sign will be always 0
// 1 &= (3 != 0)
// 1
// isSigned := 1
hi -= isSigned; // if the last bit should be sign-bit
// don't evaluate it as value
// hi := 2
result = value & ((1 << hi) - 1); // (1<<hi)-1 creates bit mask
// 0000 0111 & ((1 << 2) - 1)
// 0000 0111 & (100 - 1)
// 0000 0111 & 011
// 0000 0011
// result := 3
if (isSigned) // true
return -result; // return inverted result
// -3
return result; // if false return result
}
int main()
{
assert(0 == getField(0, 0, 0, 0));
assert(0 == getField(0, 0, 0, 1));
assert(0 == getField(15, 0, 0, 0));
assert(0 == getField(15, 0, 0, 1));
assert(0 == getField(15, 1, 1, 0));
assert(0 == getField(15, 3, 3, 1));
assert(0 == getField(0, 3, 0, 0));
assert(0 == getField(0, 4, 0, 1));
// (sign bit)[value bits]
assert(1 == getField(1, 1, 0, 0)); // 000[1]
assert(0 == getField(1, 1, 0, 1)); // 000(1)
assert(3 == getField(15, 2, 0, 0)); // 11[11]
assert(1 == getField(15, 2, 1, 0)); // 11[1]1
assert(7 == getField(15, 4, 1, 0)); // [111]1
assert(2 == getField(5, 4, 1, 0)); // [010]1
assert(2 == getField(5, 3, 1, 0)); // 0[10]1
assert(5 == getField(10, 4, 1, 0)); // [101]0
assert(1 == getField(10, 3, 1, 0)); // 1[01]0
assert(-1 == getField(15, 2, 0, 1)); // 11(1)[1]
assert(0 == getField(15, 2, 1, 1)); // 11(1)1
assert(-3 == getField(15, 4, 1, 1)); // (1)[11]1
assert(2 == getField(5, 4, 1, 1)); // (0)[10]1
assert(0 == getField(5, 3, 1, 1)); // 0(1)[0]1
assert(-1 == getField(10, 4, 1, 1)); // (1)[01]0
assert(1 == getField(10, 3, 1, 1)); // 1(0)[1]0
assert(-2 == getField(12, 4, 1, 1)); // (1)[10]0
assert(-2 == getField(10, 4, 0, 1)); // (1)[010]
assert(-3 == getField(28, 5, 2, 1)); // 000(1) [11]00
}
没有循环。 2 个跳转( (hi != 0)
和 if(isSigned)
),但对我来说, Release模式下的 VCv120 以某种方式处理第一个跳转,所以在代码中我只得到 if()
。我不知道如何摆脱它。
也没有乘法( <<
- 位移而不是乘法乘以 2),并且只有 4 次减法。不确定哪一个会更快...剩下的一跳...
还有一个时间功能(这次没有注释)
int getField(int value, int hi, int lo, int isSigned) {
int result = 0;
assert(hi >= lo);
isSigned = (value >> (hi-1)) & isSigned;
value >>= lo;
hi -= lo;
isSigned &= (hi != 0);
hi -= isSigned;
result = value & ((1 << hi) - 1);
if (isSigned)
return -result;
return result;
}
我设法稍微清理了代码:
int getField(int value, int hi, int lo, int isSigned) {
assert(hi >= lo);
hi -= lo;
value >>= lo;
value &= ((1 << hi) - 1);
isSigned <<= (hi - 1);
isSigned &= value;
if (isSigned && (hi != 0)) {
value -= isSigned;
value = ~value + 1;
}
return value;
}
但是生成的asm有2次跳转...
在此版本中:
int getField(int value, int hi, int lo, int isSigned) {
assert(hi >= lo);
hi -= lo;
isSigned &= (hi != 0);
value >>= lo;
value &= ((1 << hi) - 1);
isSigned <<= (hi - 1);
isSigned &= value;
if (isSigned) {
value -= isSigned;
value = ~value + 1;
}
return value;
}
只有一次跳跃。
关于c - C 中的 getField 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25828773/
对于我的应用程序,我需要能够找到类型(不是实例)的字段列表以及运行时这些字段的类型。到目前为止,我只能获得一个包含classOf[MyCaseClass].getMethods的getter的case
我正在尝试在个人资料页面上显示用户行中的点。我尝试使用以下内容 getField('points');?> 拉出包含用户点的字段,但没有为我正在测试的用户显示任何内容。我正在测试它,以设置了 16 点
问题:我希望用户输入一种颜色(红色、蓝色)并将其转换为与颜色一起使用 我一直在看这个 Getting a Color from a String input ,我知道最好使用 JColorChoose
谁能看出我在下面做错了什么?该类型具有服务方法试图访问的公共(public)属性,那么为什么它没有被反射拾取? Public class SomeClass { private YetAnoth
我正在尝试 getField 但总是返回 null这是代码的图像和变量的监视。 代码:FieldInfo xSortField = xFieldInfo.GetValue(x).GetType().G
我试图反射(reflect)派生类型中的字段,但它返回的字段基本类型。 public class basetype { string basevar; } public class deriv
我目前正在尝试将 Xamarin.iOS 应用程序库转换为 PCL。我有这段无法编译的代码: private void SetPrivateField(object item, string
我希望能够为用户定义的类型创建一个调度,该类型本质上将进行就地复制。但是,我想以一种类型稳定的方式来做,因此我想避免使用 getfield直接,而是尝试使用生成的函数。像这样的类型是否可能 type
我注意到在调用 GetFields() 时在枚举类型上,我得到了一个 int32 类型的额外字段。它从哪里来的?? 当我调用另一个重载 (GetFields(System.Reflection.Bin
我试图了解 Mirrors Api 的工作原理。具体来说,如何从它的Symbol中获取一个字段的值, 使用 getField . 对于getField方法,它应该适用于任何 Symbol这是一个 se
我有一个示例类: public class A { public int x; } 如果我要做如下的事情: Class a = Class.forName("A"); for (Field f
如果我通过 Assembly.Load 加载程序集,我可以迭代其类型,通过 typef(...).IsAssignableFrom 查找特定类型,并通过 GetField 从类型中获取字段信息。 当我
public string[] tName = new string[]{"Whatever","Doesntmatter"}; string vBob = "Something"; string[]
我已将 720 张新图像添加到我的 Drawable 文件夹中,但是当我使用 Field[] drawables = android.R.drawable.class.getFields() 时,没有
在我目前正在处理的项目中,我偶然发现了这个问题: 我想创建类“ApiID”的实例。我从 Reflector 获得了代码,如您所见,.dll(不是我的项目)导入来自非托管代码,我无权访问。 [S
Class.getFields() 的 Javadoc 说:“返回的数组中的元素未排序且未按任何特定顺序排列。” 关于订单实际如何确定的任何提示?有没有可能当我两次执行这个方法时,我得到的字段顺序不同
这段旧代码在使用反射的方法调用中返回一个用属性修饰的字段列表 有没有办法用 TypeDescripter 或 LINQ 替换它? public static FieldInfo[] GetFi
我正在尝试检索对象的公共(public)属性,但它没有返回任何内容。你能告诉我我做错了什么吗? public class AdHocCallReportViewModel : ReportViewMo
我正在尝试实现一个位于 https://github.com/jbogard/presentations/blob/master/WickedDomainModels/After/Model/Enum
C#,网络 2.0 这是代码(我取出了所有特定于域的内容,它仍然返回一个空数组): using System; using System.Collections.Generic; using Syst
我是一名优秀的程序员,十分优秀!