C++ 数字左边的加法
我们怎样才能在左侧FF而不是00处进行加法? 例如,我们有a=E8,我们需要a=0xFFFFFFe8C++ 数字左边的加法,c++,c,C++,C,我们怎样才能在左侧FF而不是00处进行加法? 例如,我们有a=E8,我们需要a=0xFFFFFFe8 0xFFE26C02 -> 0xFFE26C02 0x000000e8 -> 0xFFFFFFe8 0x100000e8 -> 0x100000e8 0x001000e8 -> 0xFF1000e8 p.S.数据类型int32或int64无需直接计算,只需迭代整数的每个字节,并用FF替换最后一个连续的00 您还可以或使用掩码创建整数,该掩码可以通过第一次遍历整数
0xFFE26C02 -> 0xFFE26C02
0x000000e8 -> 0xFFFFFFe8
0x100000e8 -> 0x100000e8
0x001000e8 -> 0xFF1000e8
p.S.数据类型int32或int64无需直接计算,只需迭代整数的每个字节,并用
FF
替换最后一个连续的00
您还可以
或使用掩码创建整数,该掩码可以通过第一次遍历整数内存轻松构建。无需直接计算,您只需迭代整数的每个字节,并将最后一个连续的00
替换为FF
您还可以或使用掩码创建整数,该掩码可以通过第一次遍历整数内存轻松创建。我想您的问题是如何将位放在数字中最左边的“1”上
以下是我的解决方案:
让我们以数字01000(作为num)为例:
首先,执行~num,得到10111李>
然后加1,(~num+1)的答案是10111000
做(~num+1)&(num),你会得到000011000
最后,(~num+1)&num的结果是得到num中最右边的“1”
要获取最左边的一个,请执行循环,条件为:
while(num-(~num+1)&num)
最后,你会得到01000000这个数字
因此,将“0”定位到最左边的“1”很容易
希望能有所帮助。我想你的问题是如何将位放在数字中最左边的“1”上
以下是我的解决方案:
让我们以数字01000(作为num)为例:
首先,执行~num,得到10111李>
然后加1,(~num+1)的答案是10111000
做(~num+1)&(num),你会得到000011000
最后,(~num+1)&num的结果是得到num中最右边的“1”
要获取最左边的一个,请执行循环,条件为:
while(num-(~num+1)&num)
最后,你会得到01000000这个数字
因此,将“0”定位到最左边的“1”很容易
希望有帮助。您可以使用以下命令将0
的所有前导字节转换为FF
int RevLeadingZeros(int number)
{
if((number & 0xFF000000)==0)
number |= 0xFF000000
else
return number;
if((number & 0x00FF0000)==0)
number |= 0x00FF0000
else
return number;
if((number & 0x0000FF00)==0)
number |= 0x0000FF00
else
return number;
if((number & 0x000000FF)==0)
number |= 0x000000FF
else
return number;
}
您可以使用以下命令将0
的所有前导字节转换为FF
int RevLeadingZeros(int number)
{
if((number & 0xFF000000)==0)
number |= 0xFF000000
else
return number;
if((number & 0x00FF0000)==0)
number |= 0x00FF0000
else
return number;
if((number & 0x0000FF00)==0)
number |= 0x0000FF00
else
return number;
if((number & 0x000000FF)==0)
number |= 0x000000FF
else
return number;
}
这些计算在我看来不一致。哪个数据结构?整数还是字符串?@LightnessRacesinOrbit矛盾在哪里?我不see@Qwerty:在最左边的字节中有0x10
->0x10
,但0x00
->0xFF
。然后,在第二个示例中,前三个字节全部采用0xFF
。这只是我的问题,还是毫无意义?你的意思是“将前导的00变为FF,直到到达一个非'00'字节?”这些计算在我看来并不一致。哪个数据结构?整数还是字符串?@LightnessRacesinOrbit矛盾在哪里?我不see@Qwerty:在最左边的字节中有0x10
->0x10
,但0x00
->0xFF
。然后,在第二个示例中,前三个字节全部采用0xFF
。仅仅是我,还是没有意义?你的意思是“把前导的00变成FF,直到你碰到一个非'00'字节?”