Почему в C ++ нет такого побитового компаратора, как «====»? Должен ли я приводить переменные каждый раз?
(примечание: я уже знаю логико-арифметические операторы, выглядят иначе. Кстати, здесь также нет арифметики-xor a ^^ b 🙂
Я знаю, что могу проверить&b против a (или b), a ^ b против нуля, …
)
#include "stdafx.h"#include<iostream>
#include<stdlib.h>
int main()
{
char a=-1;
unsigned char b=0;
for(b=0;b<255;b++)
{
if(a==b)std::cout<<(int)b; //cannot find 11111111)2==11111111)2
//ok, it looks -1==255 surely
//if(a====b)std::cout<<" bitwise equal "; could be good
}bool compare=true;
bool bit1=false,bit2=false;
unsigned char one=1;
b=255; //bit-swise equal to a
for(int i=1;i<7;i++)
{
bit1=(a>>i)&one;
bit2=(b>>i)&one;
if(bit1!=bit2){compare=false;return;}//checks if any bit is different
}
if(compare)std::cout<<(int)b; //this writes 255 on screen
getchar();
return 0;
}
Благодарю.
Я мог бы сделать:
__asm
{
push push....
mov al,[a]
mov dl,[b]
cmp al,dl //this is single instr but needs others
je yes
mov [compare],false
jmp finish
yes:
mov [compare],true
jmp finish
finish:
pop pop...
Раздутый код …
Вы могли бы сделать что-то вроде:
a ^ b == 0
Такой оператор не будет работать, потому что он будет зависеть от платформы.
Я предполагаю, что ‘x === y’ должен возвращать false, когда x и y имеют разную длину, а так как int имеет разную длину на разных платформах, так будет и результат этой операции.
Вы действительно должны сравнить подписанный с неподписанным?
Вы должны изменить свой алгоритм, чтобы оба операнда ==
иметь такую же подпись.
Вы не можете делать какие-либо сравнения на char
или же unsigned char
, интеграл
продвижение означает, что наименьший интегральный тип, который вы можете сравнить
int
; оба char
и unsigned char
будет повышен до int
перед сравнением. (После чего на большинстве современных машин
не будет разницы между побитовым сравнением и сравнением значений.)
Я испытываю желание сказать, что вы не должны хотеть побитового сравнения. Во многих
пути, неявные преобразования (включая рекламные акции) вызывают больше
проблемы, чем что-либо еще, и логично, вы должен должен быть
явно, и укажите, что вы хотите сравнить. (И тесты для
равенство гарантированно будет «большим», если тип unsigned char
,
Вот почему memcmp
определяется с точки зрения unsigned char
сравнения.)