有人能解释一下为什么在C/C++中大约4字节整数的32位移位不能返回零吗?为什么它依赖于编译器的-O选项?
例如,在gcc 4.8.3中,这段代码给出了使用-O0的45条和带有-O3选项的0:
unsigned int x = 45; // 4 bytes
x = x >> 32;
printf("%u\n", x);
为什么是这样?
为了在c中实现逻辑右移,我在web上搜索并得到了以下C代码
int a, b, c;
int x = -100;
a = (unsigned) x >> 2;
b = (0xffffffff & x) >> 2;
c = (0x0 | x ) >> 2;
现在a和b都是逻辑右移结果(1006632960),但c仍然是算术移位结果(-25),有人能解释一下为什么吗?thx
我只是被这个小逻辑困住了,说我搞错了。
int是32位,所以假设二进制数为20就像
// 00000000000000000000000000010100
。。现在,如果我执行正确的移位操作,比如说4
int a = 20>>4;
// 00000000000000000000000000000001
..so结果为1
现在说我再拿20并做5次右转操作
int b = 20>>5; //00000000000000000000000000000000
..so结果为0
如果我做32次右班..。为什么我得到的号码和我分配的一样?
int c
我正在写一个程序来检测偶数位中是否有1。例如,0101在偶数位中有一个。这个解决方案碰巧有效,但我不知道为什么。
让我困惑的是,当我们将16位向右移动时。例如,对于0101,我们只是创建了0000,000,000,000,0101,对吗?然后我们对原来的数字进行and运算,所以它应该是0000,0000,0000,0101 &,0000,0000,0000,0000,0101是相同的数字,对吗?所以如果我们一遍又一遍地做移位,最终x&1,我看不出这对返回1 if allEvenbits有什么帮助。
/*
* allEvenBits - return 1 if all eve
对于使用位掩码的程序,我想用二进制格式写数字.也就是说,为了将x的前8位复制到z,我编写
y = 0xff000000;
z = 0;
z = (y & x) | z
其中x, y, z都是int。现在,使用左移位和右移位操作符,我想要将1s的y右或左移动到另一组位的位掩码,所以我编写了以下代码
cout<< bitset<32>(y>>10) <<"\n" << bitset<32>(y<<10) <<endl;
现在,我所期望的产出是:
00000000001111111
我试图将一些代码从Java移植到C#。在Java中,我有以下方法:
public static int eval(long hand) {
final int c = (int)hand & 0x1FFF;
final int d = ((int)hand >>> 13) & 0x1FFF;
final int h = (int)(hand >>> 26) & 0x1FFF;
final int s = (int)(hand >>> 39);
这是的后续版本
CMS友好地提供了使用位运算符在C中添加两个数字的示例:
#include<stdio.h>
int add(int x, int y) {
int a, b;
do {
a = x & y;
b = x ^ y;
x = a << 1;
y = b;
} while (a);
return b;
}
int main( void ){
printf( "6 + 3 = %d", add(6,3));
printf(
#include <stdio.h>
int main()
{
int decimal_num, c, result;
printf("Enter an integer in decimal number system\n");
scanf("%d", &decimal_num);
for (c = 31; c >= 0; c--)
{
result = decimal_num >> c;
if (result & 1)
printf("1");
所以我在C语言中到处乱搞,我看到了一个有趣的输出:
int main()
{
int a = 0x00FF00FF;
int b = 0xFFFF0000;
int res = (~b & a);
printf("%.8X\n", (res << 8) | (b >> 24));
}
这个语句的输出是:
FFFFFFFF
我预期输出是
0000FFFF
但为什么不是呢?我是不是漏了点东西?
我正在写一个小程序来获得一些位操作的经验,我遇到了这种情况。我试图创建一个掩码,将MSB中的所有位设置为0到某个数字n。当n为32时,问题就出现了。以下是演示该问题的一些代码。
int n = (sizeof(int) * 8) - 0; //Here n is basically set to 32.
std::cout << n << std::endl; //And indeed, this prints 32.
//here I expect to see 0 (basically all 32 bits of the number shoul
我的问题是关于代码,它生成字符串的哈希值,一次加起来4个字节。它完全可以工作,但我不能理解这段代码中的一些行,即在某些行中执行的想法。因此,我需要你们中的一些人的帮助,他们对哈希相当熟悉。
下面是完整的代码:
long sfold(String s, int M) {
int intLength = s.length() / 4;
long sum = 0;
for (int j = 0; j < intLength; j++) {
char c[] = s.substring(j * 4, (j * 4) + 4).toCharArray();
long mult =
我不明白为什么CRC的理论和实施不合理?我的意思是在实现中首先执行位移位,然后执行xor。但第一位是不会被学到的。从第一位开始解释xor。这里是我的CRC4代码
public enum CRC4_POLY
{
CRC4 = 0x0B //1011
};
public class CRC4Calc
{
private byte[] table = new byte[16];
public byte Checksum(params byte[] val)
{
if (val == null)
throw new Argum
最近我找到了布鲁斯·施耐尔( Bruce )的一本“应用密码”(),这本书读得很好。现在我了解了书中概述的几种算法,我想开始在C中实现其中的几种算法。
许多算法的共同点之一是将一个x位密钥分成几个较小的y位密钥。例如,Blowfish的键X是64位,但是您需要将其分解为两个32位的二分之一: Xl和Xr。
这就是我被困的地方。我在C方面相当不错,但在位运算符之类的方面,我并不是最强的。
在对IRC进行了一些帮助之后,我成功地提出了这两个宏:
#define splitup(a, b, c) {b = a >> 32; c = a & 0xffffffff; }
#defin
我在Linux上使用GCC编译器。
我想使用64位编译器并使用-m32选项构建一些文件(32位兼容性)。我发现编译器的行为很奇怪。
我的代码很简单:
int main () {
int test =(((0) & 0x00000000) << (32));
return 0;
}
对于这段代码,我收到了关于32、64和64以及-m32编译器的警告:
warning: left shift count >= width of type [enabled by default]
但是当我试图从assebmly code编译它的时候
.quad (((0) &a