- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
例如我有以下号码:
0x FF 00 FF
现在,我希望 00 部分只有在它为 0 时才为 1。我是否需要检查每个字节,或者是否有可以在这里使用的位技巧?
示例:
我有一个无符号长 IP,我用字符串函数对它进行哈希处理,但该函数终止于空字节,因此我需要将所有空字节设置为 1:
0x7F000001(127.0.0.1,可以是 0x0100007F 但无论如何取决于平台)
现在,我想将 0 字节变成 1:
0x7F010101(所以会变成127.1.1.1)
这是做我想做的唯一方法,这
char ip_sz[5];
*(unsigned long*)ip_sz = ulong_ip;
if (!ip_sz[0]) ip_sz[0] = 1;
if (!ip_sz[1]) ip_sz[1] = 1;
if (!ip_sz[2]) ip_sz[2] = 1;
if (!ip_sz[3]) ip_sz[3] = 1;
?
真的,好奇心。我不关心性能,因为我知道编译器无论如何都会优化它。
最佳答案
您可以通过应用位掩码(即在您希望检查的位置包含 1 而在所有其他位置包含零的数字)来检查整个字节是否为零*) 给它。
在您的情况下,您需要一个位掩码,在从零开始的位置 7 到 15(含)中包含八个连续的 1,即 0x00FF00
。如果对掩码和数字 n
应用按位“AND”&
,只有当 n
的所有位在位置 7 到 15 为零。否则,结果将是一些非零数。
int n = 0xFF00FF;
int mask = 0x00FF00;
if ((n & mask) == 0) {
... // Modify n as needed
}
您可以手动构造一个八位位掩码,或使用左移运算符,如下所示:
(0xFF) // 0x000000FF
(0xFF << 8) // 0x0000FF00
(0xFF << 16) // 0x00FF0000
(0xFF << 24) // 0xFF000000
so, I would still have to do four
if
's?
在这种特定情况下,if
不是必需的,因为 C 中的一个小技巧:您可以使用 !
将零转换为一,将任何其他数字转换为零.我将用一个字节来说明这一点;您可以使用移位将其扩展为整数。
uint8_t n = ... // Some value
n = n | (!n); // Here is the trick
最后一个操作将 0x00 转换为 0x01,而所有其他值(即 0x01 到 0xFF,含)保持不变 (demo)。
* 位掩码的构造取决于您对其应用的操作。对于“AND”和“XOR”,您将所需的位标记为 1,而对于“OR”,您将它们标记为 0。
关于c - 仅当它为 0 时如何启用 octed 中的位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27766130/
注意:此问题已从其原始形式进行了彻底编辑 我正在尝试通过实现与体素化相结合的八叉树数据结构来创建对数光线追踪器,以实现快速光线追踪。 目前我在光线碰撞检测方面遇到问题。 预期的输出应该是带有法线贴图的
编写一个应用程序,输入一个由用户提供的 5 位数字组成的数字,将该数字分隔成单独的数字,并打印这些数字,每个数字之间用三个空格分隔。例如,如果用户输入数字 12345,程序应打印 1 2 3
在 Octave .oct 文件中,可以这样提取子矩阵: B = A.extract(a-1,c-1,b-1,d-1) ; 相当于 Octave 代码中的 B = A(a:b,c:d),但是否可以用类
这主要针对Octave的用户。 在 Octave 的 c++ API 文档中,其中一个示例是将两个矩阵相加的函数,如下所示: */addtwomatrices.cc #include DEFUN_D
我有一个 (OCT) 图像,如下所示(原始)。如您所见,它主要有 2 层。我想生成一个图像(如第 3 张图所示),其中红线表示第 1 层的顶部边界,绿色表示第 2 层最亮的部分。 我试图简单地对图像进
HEX: 复制代码 代码如下: #include <iostream.h> #include <iomanip.H> main(void) {
我需要实现输入日期(例如 2014 年 9 月、2014 年 10 月、2014 年 11 月等)是否为当前月份的逻辑。我已经编写了以下逻辑,用于使用以下方法检查所选周是否为当前周,但无法在当前月份实
我正在尝试编写一个使用 linasm-1.13 library 的 Octave C++ .oct 函数但我似乎无法从/usr/share/zoneinfo/获得基本的 tzdata 加载来工作。到目
我正在使用通过包控制下载的 sublime text 3 和 SCSS 编译器。拥有之后: &:before{ content: "“"; } 它将我的内容替换为: content: "ÔÇť"; 有
不确定这是系统问题还是版本问题,但是在调用嵌入式 oct() 函数时我缺少预期的八进制前缀?这是我的例子 # Base conversion operations print 'x = 1234 '
考虑在 C++ Octave 函数中创建 3 维数组 NDArray 的问题。 我有一个双指针 double* ptr 和来自 Armadillo cube 的维度 int dim[3]。我找到了一个
我很难掌握如何迭代八叉树或四边形。这可能是因为我没有经历过不同的迭代神话。但是让我们假设我生成了一个包含 float x,y,z 的四叉树;双字颜色。现在,我们还假设这个节点一次只能产生 4 个 ch
我有一个脚本可以解析一个大文本文件,提取某些值(使用 line.split),并将它们存储在一个文本文件中。我在将八进制值保存到文件时无法解释时遇到问题。 当我手动指定 oct 字符的 string
这个问题在这里已经有了答案: How to get 3 letter abbreviation for month in SQL (3 个答案) 关闭 5 年前。 我目前正在处理一个如下所示的表格:
这可能是个愚蠢的问题。 当我尝试构建一些方法时,例如 “有效地八进制到十进制”,我被提醒有文字可以完成这项工作。这将是最快的、按位的、内置的系统方式。 对于八进制,前缀为“0”。 对于十六进制,前缀为
编辑:这是我目前拥有的用于生成患者 Oct 元组的代码。(感谢 Anon 告诉我如何计算加权概率/设置种子) fun genPatients(x:int) = let val seed=let val
例如我有以下号码: 0x FF 00 FF 现在,我希望 00 部分只有在它为 0 时才为 1。我是否需要检查每个字节,或者是否有可以在这里使用的位技巧? 示例: 我有一个无符号长 IP,我用字符串函
原理 十进制转n进制都可以使用倒除法:对十进制进行除n的运算,直到商为0为止,然后将各个步骤中得到的余数倒着写出来. n进制转十进制:(例子:二进制转十进制) 101001 => 2^5 +
#include #include using namespace std; int main() { // int t = 0b11011101; strings
我正在尝试查询 MYSQL 数据库以返回包含今天日期的所有记录 - SELECT * FROM credit_application created_on = '15-OCT-15'; 但由于查询中的
我是一名优秀的程序员,十分优秀!