我正在向Haskell移植一些命令性代码.我的目标是分析一个可执行文件,因此文本部分的每个字节都分配了许多标志,这些标志都适合一个字节(准确地说是6位).
在像C这样的语言中,我只需要分配一个字节数组,将它们归零并随时更新它们.我如何在Haskell中有效地完成这项工作?
换句话说:我正在寻找具有逐位访问和恒定时间更新的ByteString,因为我反汇编了更多的文本部分.
编辑:当然,如果它同样有效,任何其他数据结构都可以.
当您将鼠标悬停在按位枚举(或无论如何称呼)变量(在调试时)上时,我试图通过获取枚举并将其转换为字符串来执行 Intellisense 在 Visual Studio 中所做的操作。
例如:
#include <iostream>
enum Color {
White = 0x0000,
Red = 0x0001,
Green = 0x0002,
Blue = 0x0004,
};
int main()
{
Color yellow = Color(Green | Blue);
std::cout << yellow << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果您将鼠标悬停在上面,yellow您会看到:
所以我希望能够调用类似的东西:
std::cout << BitwiseEnumToString(yellow) << std::endl;
Run Code Online (Sandbox Code Playgroud)
并输出打印:Green | Blue。
我编写了以下内容,试图提供打印枚举的通用方法:
#include <string>
#include <functional>
#include <sstream>
const char* ColorToString(Color color)
{
switch (color)
{
case White:
return "White";
case Red:
return "Red";
case …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试提出一种巧妙的方法来实现标志,除了通常的“true”和“false”之外,还包括状态“default”和(可选)“toggle”。
标志的一般问题是,它有一个函数并希望通过传递某些参数来定义其行为(“做某事”或“不做某事”)。
使用单个(布尔值)标志,解决方案很简单:
void foo(...,bool flag){
if(flag){/*do something*/}
}
Run Code Online (Sandbox Code Playgroud)
在这里添加默认值特别容易,只需将函数更改为
void foo(...,bool flag=true)
Run Code Online (Sandbox Code Playgroud)
并在没有标志参数的情况下调用它。
一旦标志数量增加,我通常看到和使用的解决方案是这样的:
typedef int Flag;
static const Flag Flag1 = 1<<0;
static const Flag Flag2 = 1<<1;
static const Flag Flag3 = 1<<2;
void foo(/*other arguments ,*/ Flag f){
if(f & Flag1){/*do whatever Flag1 indicates*/}
/*check other flags*/
}
//call like this:
foo(/*args ,*/ Flag1 | Flag3)
Run Code Online (Sandbox Code Playgroud)
这样做的好处是,您不需要每个标志的参数,这意味着用户可以设置他喜欢的标志,而只需忘记他不关心的标志。特别是你不会接到电话,比如foo (/*args*/, true, false, true)你必须计算哪个真/假表示哪个标志。
这里的问题是:
如果你设置了一个默认参数,一旦用户指定了任何标志,它就会被覆盖。不可能像Flag1=true, Flag2=false, Flag3=default.
显然,如果我们想要 3 个选项(真、假、默认),我们需要为每个标志至少传递 2 位。因此,虽然它可能不是必需的,但我想任何实现都应该很容易使用第 …
我有一个包含几个标志的XML,其中一些是无符号的32位整数,另一些是无符号的64位整数.其中一些是用逗号分隔的列表编写的,另一些是十六进制的.
看这个例子:
<Color>Blue,Red</Color>
<Color>0xC</Color>
Run Code Online (Sandbox Code Playgroud)
因为我不想编写解析每个枚举的方法,所以我决定使用泛型方法.但Visual Studio不会让我构建解决方案.这是我的方法:
public static T ParseFlags<T>(string value) where T : struct
{
T result = (T)((object)0);
string[] array;
// Remove white spaces and delimit string if it is comma-separated
if (ParseDelimitedString(value, ',', out array))
{
for (int i = 0; i < array.Length; i++)
{
T flag = (T)((object)0);
// Check if value is member of enumeration
if (Enum.TryParse<T>(array[i], out flag))
{
result |= (T)((object)flag);
}
}
}
else
{
switch (Type.GetTypeCode(Enum.GetUnderlyingType(typeof(T))))
{
// Remove hex …Run Code Online (Sandbox Code Playgroud) 假设我有一个枚举,其位标志选项大于标准数据类型中的位数:
enum flag_t {
FLAG_1 = 0x1,
FLAG_2 = 0x2,
...
FLAG_130 = 0x400000000000000000000000000000000,
};
Run Code Online (Sandbox Code Playgroud)
这是不可能的,原因有很多。枚举的最大大小为 128 位(在我的系统上通过实验在 C/gcc 中),单个变量的最大大小也为 128 位等。
在 C 中,您不能对数组执行按位运算,但在 C++ 中,我想您可以重载按位运算符来使用循环来完成这项工作。
除了手动记住哪些标志去哪里对大数字进行这项工作之外,在 C 中有什么方法吗?
我正在处理文件状态标志。在我进行的测试中,我发现
#include <stdio.h>
#include "fcntl.h"
int main() {
const int flag = O_RDONLY;
printf( "*** Flag O_RDONLY = %5d\n", flag);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产生这个输出
*** Flag O_RDONLY = 0
Run Code Online (Sandbox Code Playgroud)
这完全符合
#define O_RDONLY 00
Run Code Online (Sandbox Code Playgroud)
从fcntl-linux.h.
如何将零值用作标志?
我希望“原子”标志是2^n( n>=1),而“复合”标志(如O_ACCMODE)只是几个原子标志的总和(这与按位或对这些原子标志进行按位或运算相同)。
据我了解,我无法“检测”任何东西,也无法设置此类标志。一个按位与运算的表达式 like(stat & O_RDONLY)总是错误的。
有关的:
如何获取文件描述符的模式?(我问过这个)
我正在为SEO写一个免费的工具......从seomoz实现api,旗帜看起来像这样
URL Metric,Bit Flag
Title,1
URL,4
Subdomain,8
Root Domain,16
External Links,32
Links,2048
mozRank,16384
mozTrust,131072
Run Code Online (Sandbox Code Playgroud)
这些只是一些,但我不知道如何计算javascript中的正确位标志...它只是我想要使用的标志的所有整数的OR?一个小片段向我展示如何制作一个包含其中一些标志的var会很棒......
谢谢你的帮助!
我有一个PHP类,其中包含一个将实例打印到表行的方法.有时我想在开头没有名字打印出一行,有时我想要打印所有行项,依此类推.
我决定使用位标志以使代码更具可读性,但标志的处理看起来很糟糕.这是我第一次使用位标志.
我已经在类的顶部定义了标志,如下所示;
define('BAT_TABLE_ROW_PLAYER', 1);
define('BAT_TABLE_ROW_NOPLAYER', 2);
define('BAT_TABLE_ROW_FIELD', 4);
define('BAT_TABLE_ROW_ALL', 7);
Run Code Online (Sandbox Code Playgroud)
使用标志的函数如下所示;
function tableLine($flag=BAT_TABLE_ROW_ALL) {
if(in_array($flag,[1,3,5,7]))
// just return player cell
if(in_array($flag,[2,3,6,7]))
// return all other cells (except fielding)
if(in_array($flag,[4,5,6,7]))
// return fielding cells
return $rtn;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,如果BAT_TABLE_ROW_ALL已设置,则所有选项都按计划执行.
问题是,如果我出于某种原因添加另一个标志(因此将其设置为8,并将ALL设置为15 - 尽管这将是无关紧要的),我将不得不重写整个函数.这不可能是对的.
有没有更好的方法来编写上面的函数所以我所要做的就是更新标志定义,然后只是将额外的标志执行添加到函数中?
我正在尝试解码位掩码
[Flags]
public enum Amenities
{
BusinessCenter = 1,
FitnessCenter = 2,
HotTub = 4,
InternetAccess = 8,
KidsActivities = 16,
Kitchen = 32,
PetsAllowed = 64,
Pool = 128,
Restaurant = 256,
Spa = 512,
Whirlpool = 1024,
Breakfast = 2048,
Babysitting = 4096,
Jacuzzi = 8192,
Parking = 16384,
RoomService = 32768,
AccessibleTravel = 65536,
AccessibleBathroom = 131072,
RollShower = 262144,
HandicappedParking = 524288,
InRoomAccessibility = 1048576,
AccessibilityDeaf = 2097152,
BrailleSignage = 4194304,
FreeAirportShuttle = 8388608,
IndoorPool = …Run Code Online (Sandbox Code Playgroud) from enum import Enum
class InputTypes(Enum):
"""
Flags to represent the different kinds of input we
are acting on from the user
"""
KEYBOARD = 0b00000001,
MOUSE_BUTTONS = 0b00000010,
MOUSE_MOVE = 0b00000100,
ALL = 0b11111111
if __name__ == "__main__":
x = (InputTypes.KEYBOARD | InputTypes.MOUSE_BUTTONS)
Run Code Online (Sandbox Code Playgroud)
我收到错误:
TypeError: unsupported operand type(s) for |: 'InputTypes' and 'InputTypes'
Run Code Online (Sandbox Code Playgroud)
如何在 python 2.7 和 python3 中正确定义一些标志并使用它们?