这是一段看似非常特殊的C++代码.出于某种奇怪的原因,奇迹般地对数据进行排序使得代码几乎快了六倍.
#include <algorithm>
#include <ctime>
#include <iostream>
int main()
{
// Generate data
const unsigned arraySize = 32768;
int data[arraySize];
for (unsigned c = 0; c < arraySize; ++c)
data[c] = std::rand() % 256;
// !!! With this, the next loop runs faster.
std::sort(data, data + arraySize);
// Test
clock_t start = clock();
long long sum = 0;
for (unsigned i = 0; i < 100000; ++i)
{
// Primary loop
for (unsigned c = 0; c < arraySize; ++c) …Run Code Online (Sandbox Code Playgroud) 我一直在尝试在业余时间学习C语言,其他语言(C#,Java等)具有相同的概念(通常是相同的运算符)......
我想知道是,在核心层,是什么位移(<<,>>,>>>)这样做,可以帮助它什么问题解决,和周围的弯曲什么潜伏的陷阱?换句话说,一个绝对的初学者指导比特移位的所有优点.
对于我的生活,我不记得如何设置,删除,切换或测试位域中的位.要么我不确定,要么混淆它们,因为我很少需要这些.因此,"比特作弊表"会很好.
例如:
flags = flags | FlagsEnum.Bit4; // Set bit 4.
Run Code Online (Sandbox Code Playgroud)
要么
if ((flags & FlagsEnum.Bit4)) == FlagsEnum.Bit4) // Is there a less verbose way?
Run Code Online (Sandbox Code Playgroud)
您能举例说明所有其他常见操作,最好是使用[Flags]枚举的C#语法吗?
我对C编程很新,我遇到了掩码.有人可以向我解释位屏蔽的一般概念和功能吗?非常感谢例子.
我在解决代码问题上遇到了一些问题.通常我首先检查字符是英文字母的上部还是下部,然后减去或添加32以将其转换为相应的字母.但我发现有人^= 32做了同样的事情.这里是:
char foo = 'a';
foo ^= 32;
char bar = 'A';
bar ^= 32;
cout << foo << ' ' << bar << '\n'; // foo is A, and bar is a
Run Code Online (Sandbox Code Playgroud)
我已经搜索了这方面的解释并没有找到答案.那么为什么会这样呢?
有一个变量,它包含一些标志,我想删除其中一个.但我不知道如何删除它.
这是我如何设置标志.
my.emask |= ENABLE_SHOOT;
Run Code Online (Sandbox Code Playgroud) 您是否曾经在实际编程项目中使用位移?大多数(如果不是全部)高级语言都有移位运算符,但什么时候你真的需要使用它们?
我正在尝试在Java字节变量中设置位.它确实提供了类似的方法.setBit(i).有谁知道我怎么能意识到这一点?
我可以通过给定的字节逐位迭代:
if( (my_byte & (1 << i)) == 0 ){
}
Run Code Online (Sandbox Code Playgroud)
但是我不能把这个位置设置为1或0,可以吗?
在C中用单位测试和设置单个位的经典问题可能是最常见的中级编程技能之一.您可以使用简单的位掩码进行设置和测试
unsigned int mask = 1<<11;
if (value & mask) {....} // Test for the bit
value |= mask; // set the bit
value &= ~mask; // clear the bit
Run Code Online (Sandbox Code Playgroud)
一篇有趣的博客文章认为,这容易出错,难以维护,而且做法不佳.C语言本身提供了类型安全和可移植的位级访问:
typedef unsigned int boolean_t;
#define FALSE 0
#define TRUE !FALSE
typedef union {
struct {
boolean_t user:1;
boolean_t zero:1;
boolean_t force:1;
int :28; /* unused */
boolean_t compat:1; /* bit 31 */
};
int raw;
} flags_t;
int
create_object(flags_t flags)
{
boolean_t is_compat = flags.compat;
if (is_compat) …Run Code Online (Sandbox Code Playgroud) 假设我有一个二进制值为11111111的字节b
例如,我如何读取从第二位开始的3位整数值或从第五位开始写入4位整数值?
c ×4
c++ ×3
bit-shift ×2
flags ×2
java ×2
.net ×1
ascii ×1
bit ×1
bitmask ×1
byte ×1
c# ×1
enums ×1
memory ×1
operators ×1
optimization ×1
performance ×1
read-write ×1
terminology ×1