왜 맨 왼쪽 비트가 1이면 빈자리에 1을 땡겨옴
이해가 안되네 이거 이렇게 돌려서 폰노이만 담배피던 시절에는 이득본게 있었음?
+ )
/2랑 똑같이 돌리려고 이런거구나
근데 그러면 굳이 시프트 연산이 따로 있을 필요가 뭐임...
(x >> n) AND (0xffff ffff - (((1<<n)-1)<<32-n)) 하면 되나?
왜 맨 왼쪽 비트가 1이면 빈자리에 1을 땡겨옴
이해가 안되네 이거 이렇게 돌려서 폰노이만 담배피던 시절에는 이득본게 있었음?
+ )
/2랑 똑같이 돌리려고 이런거구나
근데 그러면 굳이 시프트 연산이 따로 있을 필요가 뭐임...
(x >> n) AND (0xffff ffff - (((1<<n)-1)<<32-n)) 하면 되나?
팩토리오에서 그렇게 한 이유는 보통 실제 사용되는 컴퓨터의 동작방식을 그대로 베껴왔기 때문이고 실제 컴퓨터에서 시프트를 그렇게 구현한 이유는 음수를 2의 거듭제곱으로 나눌때 편하기 때문임
이 부분은 내가 좀 잘못말한것같은데 보통 컴퓨터의 명령어 집합에는 두 가지 종류의 rshfit 가 모두 있는 경우가 많음. 컴퓨터의 아키텍처 문제가 아니라 C언어같은 로우레벨 언어에서 signed int (부호 있는 정수값) 에 대한 shift를 그렇게 정의했기 때문인듯
32비트는 너무 많아서 기술하기 어려우니 8비트 아키텍처라고 하면 예를들어 -8 = 11111000 으로 표현될텐데 이걸 오른쪽으로 1칸 시프트할때 01111100 이렇게 해버리면 엉뚱한 양수가 나옴
하지만 맨 왼쪽 비트에 1을 채워서 시프트해버리면 11111100 = -4 가 나옴 -8을 2로 나눈값이지
거기까진 이해했음 근데 그러면 만약에 앞 n비트는 A에서, 뒤 32-n비트는 B에서 따서 합치고싶다면 AND연산을 메인으로 써야지 시프트를 메인으로 쓸 게 아니라는거네?
정확히 무슨 연산을 의도하는건지 모르겠는데... AND연산이랑 시프트는 각자의 쓰임이 있지않나
팩토리오는 신호 여러개가 한번에 돌아다닐 수 있다보니 문자열을 구성할 때 문자 하나에 1비트만 내주면 되니깐 char 구현 대신 팩토리오 시스템에 맞춰서 새로 문자열을 구성하기로 했는데 신호 하나가 32비트라는 이유로 주소가 32비트 간격으로 존재하면 문자 한 개 단위로 인덱스가 움직이는게 불가능해서 1비트씩 움직이는걸 시프트 연산으로 구현하려고 했음
사실 결국 lsh연산만 사용하면 되는데 동시에 rsh까지 조사하다가 머리가 꼬인거임
아 rsh도 쓰긴 해야하는구나..
나눗셈을 원하면 나누기 연산자를 사용하면 되는데도 시프트 연산자를 사용하는 이유는 시프트 연산이 훨씬 빠르기 때문임. (물론 이는 현대의 high-level 언어 관점에서는 신경 쓸 필요가 없은 차이이고 하이레벨 언어로 코딩하는데 나누기 하고싶은데 시프트가 더 빠르다고 시프트쓰면 가독성에 문제가 생기기 때문에 나쁜 practice임. 어차피 컴파일러가 알아서 최적화 해줌.)
빨라서 썼다니 이해가 되네..
보통 프로그래밍언어는 산술쉬프트(>>)랑 논리쉬프트(>>>)를 둘다 지원하는데 팩토리오는 산술쉬프트만 지원하긴 하네
만약 논리쉬프트 >>1결과가 필요하다면 일단 산술쉬프트 >>1을 설치한다음 그것과 병렬로 and 0xF0000000을 설치하고 출력을 같은 라인으로 이어주면 될 것 같음
이러면 안될거같은데
아 0x80000000
0xF0000000 이 아니라 0x80000000 을 의도한것같은데 아무튼 내생각에는 그렇게하면 >>n 하고싶을때 n이 또 다른 신호인 경우에는 좀 다른방식으로 해야할듯
x>>n 을 하고싶은데 n이 0인 경우와 n이 아닌 경우의 분기를 나눠서 n이 0일 때는 그냥 x를 뱉도록하고 n!=0 일 때는 (x&0x7FFFFFFF)>>n 을 하는식으로 구현해야할것같은데... 좀 간단히 할수있는 방법 없나
댓글 자꾸 짤려서 글에다가 올렸음
그래서 실제로도 용도따라서 lsl asl rol 다 다르게 씀
는 팩토리오엔 그게 없는
https://www.reddit.com/r/technicalfactorio/comments/oqz6wz/two_tick_logical_right_shift/
여기 보니까 2틱 청사진 있던데 지금 겜못해서 확인은 못해보겠음